通过连接表和按每个表中的列排序来优化MySQL查询
我有一个包含近900k行的列的表 id |姓名|等级 此外,我还有一个表favorites,其中存储用户添加到Favorite中的组织ID id |用户id |组织id 任务是获取按组织排名DESC排序的前10个组织,但无论如何,在顶部,我们需要显示用户最喜欢的组织。 我正在尝试使用此查询执行此操作,但需要10秒:通过连接表和按每个表中的列排序来优化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
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的,加上用户的最爱?或者您希望用户的收藏夹按排名排序?