ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

我该如何优化这个MySQL查询?

2019-06-10 14:10:29  阅读:179  来源: 互联网

标签:mysql sql


有人可以解释为什么子查询添加组使得此查询需要这么长时间(30秒):

SELECT *
FROM aggregate_songlist AS a
INNER JOIN musical_works AS m 
ON a.musical_work_id = m.id
WHERE m.genre='rock' AND m.id NOT IN 
(SELECT sources.musical_work_id FROM sources GROUP BY sources.musical_work_id HAVING COUNT(sources.musical_work_id) > 8)

如果我删除’group by'(并增加子查询的结果),则需要0.07秒:

SELECT *
FROM aggregate_songlist AS a
INNER JOIN musical_works AS m 
ON a.musical_work_id = m.id
WHERE m.genre='rock' AND m.id NOT IN 
(SELECT sources.musical_work_id FROM sources)

子查询中没有外部引用,因此它只应执行一次,对吧?自己执行:

SELECT sources.musical_work_id FROM sources GROUP BY sources.musical_work_id HAVING COUNT(sources.musical_work_id) > 8

只需0.01秒.

有什么解释吗?有关如何改变它的任何建议?

解决方法:

There are no outer references in the subquery, so it should only be executed once, right?

你会这么认为,但不是.如果查看EXPLAIN,您将看到子查询被称为“依赖子查询”而不是“子查询”.这意味着每次都会重新执行.这是MySQL 5.0中的known bug,并在MySQL 6.0中修复.

要解决此问题,您可以使用其他方法之一来检查另一个表中是否存在行.三种常用方法是NOT IN,NOT EXISTS和LEFT JOIN … WHERE … IS NULL,所以你仍然有两个选项.

标签:mysql,sql
来源: https://codeday.me/bug/20190610/1212696.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有