社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL查询优化

Michael Shnitzer • 7 年前 • 1861 次点击  

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

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