Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询优化_Mysql - Fatal编程技术网

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;