mysql - 子查询优化

标签 mysql join subquery query-optimization notin

我正在阅读这篇文章 - NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL at EXPLAIN EXTENDED ;我正在使用现有设计。

我想要的是能够从表a中选择所有不在表b中的id。

我正在使用这个查询:

SELECT a.* FROM `orders` a LEFT JOIN `orders_corrected` b ON 
a.`order_id`=b.`order_id` WHERE b.`order_id` IS NULL;

表 a 包含超过 900K 条记录,表 b 包含超过 200K 条记录并且还在增长。

上述查询大约需要 7-8 分钟。

我也尝试过使用 NOT IN,这也很慢。

order_id 列为 NOT NULL 和 UNIQUE 索引。

解释的输出:

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 595783
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: eq_ref
possible_keys: PRIMARY,order_id_UNIQUE,ix_order_id
key: PRIMARY
key_len: 152
ref: func
rows: 1
Extra: Using where; Not exists; Using index

任何帮助都会很棒。

最佳答案

What I want is to be able to select all id's from table a, which are not in table b

在涉及索引列的 WHERE 子句中使用相关子查询。例如:

SELECT U.Id
FROM Users U
WHERE (SELECT Count(Ph.UserId) FROM PostHistory Ph WHERE Ph.UserId = U.Id) = 0

引用资料

关于mysql - 子查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29297746/

相关文章:

php - mysql查询返回错误值

mysql - 多个 where 子句,仅读取一个

mysql - 根据按两个文本列排序的 SQL 获取下一行和上一行

mysql - 将列从一个表复制到另一个表

mysql - 依赖于多个表的可更新 View

php - MySQL:sum() 和连接多个表

join - Fluent NHibernate - 将属性映射到连接表上的列

PostgreSQL : comparing two sets of results does not work

mysql - 左连接与子选择 - 右表列不显示

mysql - 查找包含特定数据的字段名称(mySql)