我有两张 table :
video (ID, TITLE, ..., UPLOADED_DATE)
join_video_category (ID (not used), ID_VIDEO_ ID_CATEGORY)
视频行数:4 500 000 | join_video_category 中的行数:5 800 000
1 个视频可以有多个类别。
我有一个查询完美运行,最多 20 毫秒即可获得结果:
SELECT * FROM video WHERE ID IN
(SELECT ID_VIDEO FROM join_video_category WHERE ID_CATEGORY=11)
LIMIT 1000;
此查询需要 1000 个视频,顺序并不重要。
但是,当我想获取某个类别中的 10 个最新视频时,我的查询大约需要 30-40 秒:
SELECT * FROM video WHERE ID IN
(SELECT ID_VIDEO FROM join_video_category WHERE ID_CATEGORY=11)
ORDER BY UPLOADED_DATE DESC LIMIT 10;
我对 ID_CATEGORY、ID_VIDEO、UPLOADED_DATE、PRIMARY ON ID 视频和 join_video_category 有索引。
我已经在查询中使用 JOIN 对其进行了测试,结果相同。
最佳答案
首先,比较是针对两个截然不同的查询。第一个每当遇到视频就会返回一堆视频。第二个必须阅读所有视频,然后对它们进行排序。
尝试将其重写为JOIN
:
SELECT v.*
FROM video v JOIN
join_video_category vc
ON v.id = bc.id_video
WHERE vc.ID_CATEGORY = 11
ORDER BY v.UPLOADED_DATE DESC
LIMIT 10;
这可能有帮助,也可能没有帮助。您拥有大量数据,因此您可能拥有给定类别的大量视频。如果是这样,获取更新数据的 where
子句可能确实有帮助:
SELECT v.*
FROM video v JOIN
join_video_category vc
ON v.id = bc.id_video
WHERE vc.ID_CATEGORY = 11 AND v.UPLOADED_DATE >= '2015-01-01'
ORDER BY v.UPLOADED_DATE DESC
LIMIT 10;
最后,如果这不起作用,请考虑将 UPLOADED_DATE
之类的内容添加到 join_video_category
中。然后,这个查询应该会很成功:
select vc.video_id
from join_vdeo_category vc
where vc.ID_CATEGORY = 11
order by vc.UPLOADED_DATE desc
limit 10;
索引为 join_video_category(id_category, uploaded_date, video_id)
。
关于mysql - order by 使查询变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157086/