Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 子查询优化_Mysql_Join_Subquery_Query Optimization_Notin - Fatal编程技术网

Mysql 子查询优化

Mysql 子查询优化,mysql,join,subquery,query-optimization,notin,Mysql,Join,Subquery,Query Optimization,Notin,我在读这篇文章-;我正在使用现有的设计 我想要的是能够从表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分钟 我还尝试了在中使用,这也很慢 order\u id列不为空

我在读这篇文章-;我正在使用现有的设计

我想要的是能够从
表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分钟

我还尝试了在中使用
,这也很慢

order\u id
列不为空且索引唯一

解释的输出

*************************** 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
任何帮助都会很好

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

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

SELECT U.Id
FROM Users U
WHERE (SELECT Count(Ph.UserId) FROM PostHistory Ph WHERE Ph.UserId = U.Id) = 0
参考资料


由于您几乎选择了所有内容(无过滤器),因此您无法做太多事情。加速的一种方法是在orders表中保留一个count列,以查看有多少已更正的订单,这可以为您提供一个简单的过滤器。@Wolph这是我最后的选择。将列添加到表
a
。我正在做
a.*
,因为所有数据都是必需的。我还试着做了一个
限制5
。没有多大帮助。。