MySQL查询优化
我正在执行一个查询,该查询在一个表中查找不在另一个表中的值。例如:MySQL查询优化,mysql,Mysql,我正在执行一个查询,该查询在一个表中查找不在另一个表中的值。例如: SELECT id FROM table1 WHERE id NOT IN (SELECT id FROM table2); 两个表都有大约100万行,但只有几百行与结果集中返回的值不匹配。查询大约需要35秒。对查询进行show配置文件显示mysql大部分时间都处于“准备”状态。关于如何优化这种状态,或者在“准备”过程中实际发生了什么,有什么想法吗 两个表中的id值都已编制索引,并且具有相同的类型和大小 查询的整个配置文件是:
SELECT id FROM table1 WHERE id NOT IN (SELECT id FROM table2);
两个表都有大约100万行,但只有几百行与结果集中返回的值不匹配。查询大约需要35秒。对查询进行show配置文件显示mysql大部分时间都处于“准备”状态。关于如何优化这种状态,或者在“准备”过程中实际发生了什么,有什么想法吗
两个表中的id值都已编制索引,并且具有相同的类型和大小
查询的整个配置文件是:
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| (initialization) | 0 |
| checking query cache for query | 0 |
| Opening tables | 0.13 |
| System lock | 0 |
| Table lock | 0 |
| init | 0.01 |
| optimizing | 0 |
| statistics | 0 |
| preparing | 0 |
| executing | 0 |
| Sending data | 0 |
| optimizing | 0 |
| statistics | 0 |
| preparing | 34.83 |
| end | 0 |
| query end | 0 |
| freeing items | 0 |
| closing tables | 0 |
| logging slow query | 0 |
+--------------------------------+----------+
任何提示都将不胜感激
谢谢。我想在id为空的地方加入表2。 这将使您更快地返回数据
select
a.id
from
table1 a
left join table2 b on a.id = b.id and b.id is null
无需优化-
不在
中生成与MySQL中的左连接/为空
等效的查询计划。引述:
然而,这三种方法生成三种不同的计划,由三段不同的代码执行。执行EXISTS谓词的代码比执行index_子查询和左连接优化为使用Not EXISTS方法的代码的效率低约30%
这就是为什么在MySQL中搜索缺失值的最佳方法是使用LEFT JOIN/is NULL或NOT in而不是NOT EXISTS
有关更多信息,请参见查询仍需约30秒,但对于此“显示配置文件”,大部分时间都在“发送数据”中。这就是mysql运行查询所需的时间,还是我可以做些什么来加快速度?应该这样做吗?b.id为null?最好在WHERE子句中指定这一点;但是,优化者应该生成相同的计划。
@Mitch-Wheat
:需要在WHERE
子句中指定这一点,否则查询将返回错误的结果(仅是a
中的所有记录)表2.id
当然应该被索引以生成等效的查询。但是从它的名称(听起来像是一个PK
)以及查询1000000行需要35
秒这一事实,我们可以得出结论,它被索引了。
SELECT id FROM table1
LEFT JOIN table2 ON table1.id = table2.id
WHERE table2.id IS NULL;