mysql - order by 使查询变慢

标签 mysql sql performance database-indexes

我有两张 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/

相关文章:

php - 使用php从google maps html调用解析json数据到mysql数据库

java - 在 hibernate 中为某些查询选择 SQL 而不是 HQL 的依据是什么?

mysql - 更新语句上的缓慢 MySQL 查询

mysql - 卡住;带有聚合函数的 SQL case 语句

PHP/Mysql 字符集

sql - 不包括加入的权利的代码解释?

sql - Oracle SQL 比较包含数字的字符串,从 0(零)开始

performance - CSS3 转换会减慢网站速度吗?

java - 通过反射在 Java 中调用 getter : What's the fastest way to repeatedly call it (performance and scalability wise)?

mysql选择查询