Py学习  »  DATABASE

MySQL查询优化

Michael Shnitzer • 7 年前 • 1863 次点击  

我执行的查询是在一个表中查找不在另一个表中的值。例如:

SELECT id FROM table1 WHERE id NOT IN (SELECT id FROM table2);

两个表都有大约100万行,但只有几百行与结果集中返回的值不匹配。查询大约需要35秒。在查询上做一个show profile显示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        | 
+--------------------------------+----------+

任何小费都很感激。

谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30358
文章 [ 3 ]  |  最新文章 7 年前
Mitch Wheat
Reply   •   1 楼
Mitch Wheat    16 年前
SELECT id FROM table1
LEFT JOIN table2 ON table1.id = table2.id
WHERE table2.id IS NULL;
OMG Ponies
Reply   •   2 楼
OMG Ponies    16 年前

没有什么可优化的- NOT IN 生成等效的查询计划 LEFT JOIN/IS NULL 在MySQL中。报价:

然而,这三种方法生成三个不同的计划,由三个不同的代码块执行。执行exists谓词的代码比执行index_subquery和left join的代码效率低30%左右,并优化为使用not exists方法。

这就是为什么在MySQL中搜索缺失值的最佳方法是使用左联接/为空或不在而不是不存在。

有关详细信息,请参阅 NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL

Avitus
Reply   •   3 楼
Avitus    16 年前

我将离开ID为空的join table2。 这将使您更快地返回数据。

select
     a.id
from
     table1 a 
     left join table2 b on a.id = b.id and b.id is null