子查询优化

Subquery optimization

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

我想要的是能够 select 来自 table a 的所有 ID,它们不在 table b.

我正在使用这个查询:

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

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

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

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

order_id 列不是 NULL 且索引唯一。

explain 的输出:

*************************** 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

参考资料