子查询优化
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
参考资料
我正在通读这篇文章 - 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
参考资料