为什么按主索引排序会使此查询变慢?

时间:2011-12-11 01:33:49

标签: mysql performance join sql-order-by inner-join

此查询正在获取用户订阅上传的最新视频,其运行速度非常慢,所以我重新编写它以使用连接但它没有任何区别,在修补它后我发现删除ORDER BY会使它快跑(但是它违背了查询的目的)。

查询:

SELECT vid. *
FROM video AS vid
INNER JOIN subscriptions AS sub ON vid.uploader = sub.subscription_id
WHERE sub.subscriber_id = '1'
AND vid.privacy = 0 AND vid.blocked <> 1 AND vid.converted = 1
ORDER BY vid.id DESC
LIMIT 8

运行说明,它会在订阅表中显示“正在使用临时;使用filesort”及其缓慢(0.0900秒)。

没有ORDER BY vid.id DESC它没有显示“使用临时;使用filesort”所以它的快速(0.0004秒)但我不明白其他表如何影响它。

所有字段都已编入索引(隐私屏蔽和转换后的字段不会影响性能超过10%)。

我会粘贴完整的解释信息,但我似乎无法使其适合本网站的布局。

2 个答案:

答案 0 :(得分:3)

您将查询限制为8个结果。当你在没有order by的情况下运行它时,它可以抓住它通过条件的前8行,然后将它们交还。砰的一声,已经完成了。

当您使用order by时,您不会要求任何 8条记录。您要求vid.id方面的第一个 8条记录。因此,必须弄清楚它们是哪些,唯一的方法是查看整个表并比较vid.id值。这是更多的工作。

列上确实有索引吗?如果是这样,它可能已经过时了。你可以尝试重建它。

答案 1 :(得分:1)

通过建议mysql使用USE_INDEX(PRIMARY)的主索引来修复它

SELECT vid. *
FROM video AS vid USE INDEX ( PRIMARY )
INNER JOIN subscriptions AS sub ON vid.uploader = sub.subscription_id
WHERE sub.subscriber_id = '1'
AND vid.privacy =0
AND vid.blocked <>1
AND vid.converted =1
ORDER BY vid.id DESC
LIMIT 8