此查询正在获取用户订阅上传的最新视频,其运行速度非常慢,所以我重新编写它以使用连接但它没有任何区别,在修补它后我发现删除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%)。
我会粘贴完整的解释信息,但我似乎无法使其适合本网站的布局。
答案 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