通过连接表和按每个表中的列排序来优化MySQL查询

通过连接表和按每个表中的列排序来优化MySQL查询,mysql,sql,Mysql,Sql,我有一个包含近900k行的列的表 id |姓名|等级 此外,我还有一个表favorites,其中存储用户添加到Favorite中的组织ID id |用户id |组织id 任务是获取按组织排名DESC排序的前10个组织,但无论如何,在顶部,我们需要显示用户最喜欢的组织。 我正在尝试使用此查询执行此操作,但需要10秒: SELECT o.*, f.id from organizations o LEFT JOIN favorites f ON o.id = f.organization_id AN

我有一个包含近900k行的列的表

id |姓名|等级

此外,我还有一个表favorites,其中存储用户添加到Favorite中的组织ID

id |用户id |组织id

任务是获取按组织排名DESC排序的前10个组织,但无论如何,在顶部,我们需要显示用户最喜欢的组织。 我正在尝试使用此查询执行此操作,但需要10秒:

SELECT o.*, f.id from organizations o 
LEFT JOIN favorites f ON o.id = f.organization_id AND f.user_id = 1
ORDER BY f.id DESC, o.rank
LIMIT 10
如何优化此MySQL查询?

我的想法是子查询:

SELECT o.*, f.id
FROM ((SELECT o.*, NULL as id
       FROM organizations o 
       ORDER BY o.rank DESC
       LIMIT 10
      ) 
      UNION ALL
      (SELECT o.*, f.id
       FROM organizations o JOIN
            favorites f
            ON o.id = f.organization_id AND f.user_id = 1
      )
     ) fo
ORDER BY f.id DESC, o.rank
LIMIT 10;

为此,您需要以下索引
organizations(rank)
f(organization\u id,user\u id)

错误-字段列表中的未知列“f.id”在第一个子查询中没有
f.id
。作为id,它应该是
NULL
f
上的索引应为
(用户id、组织id)
。第二个子查询应具有按o.rank DESC LIMIT 10排序的
。而且不需要外部选择-
(选择…限制10)联合所有(选择…限制10)订单,按。。。限制10也有效。@user1712438。id应为
NULL
。请参阅:请提供
SHOW CREATE TABLE
;我们需要看到的不仅仅是列名。您想要20行吗?那些排名1..10的,加上用户的最爱?或者您希望用户的收藏夹按排名排序?