2015-01-09 114 views
0

我试图运行此查询:如何优化这个删除查询?

delete FROM `customer` where customer_id 
not in (SELECT distinct customer_id FROM `order`); 

但它需要很长的时间,导致中间timout和休息,因为customer表中有超过一百万条记录。

我怎样才能让它快速?任何选择?

编辑

这里是相同的EXPLAIN与SELECT:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  customer index NULL PRIMARY  4 NULL 127659 Using where; Using index 
2 DEPENDENT SUBQUERY order ALL  NULL NULL NULL NULL 25141 Using where 
+4

'customer.customer_id'和'order.customer_id'编入索引吗? – h2ooooooo

+0

是的,你的索引状态的一些想法会有所帮助,但它可能只是你的环境无法处理它。在SQL方面,根据您的硬件和索引策略,一百万行可能几乎无足轻重,或者可能是一项不可能实现的重大任务。 –

+2

这个问题应该可能在http://codereview.stackexchange.com/ – Jave

回答

1

尝试:

DELETE customer FROM customer t1 LEFT JOIN `order` t2 on t1.customer_id = t2.customer_id WHERE t2.customer_id is null; 
+0

我更喜欢JOIN,但不应该是'DELETE t1 FROM customer t1 ...'关于外键/索引的说明也不错。 – Arth

+0

@我认为两者都有可能。 – Jens

+0

我会很惊讶,你不能在'SELECT'中做到这一点..即使可能我会使用别名来保持一致性。我也使用'c'和'o'作为别名,我更喜欢't1'和't2'。 – Arth

0

首先,你可以从这个DELETE命令删除DISTINCT。这里没有必要。因此,尝试用这个这个

delete FROM `customer` where customer_id 
not in (SELECT customer_id FROM `order`); 

其次请执行计划重建查询

SELECT customer_id FROM `customer` where customer_id 
not in (SELECT customer_id FROM `order`); 

这将显示MySQL的执行如何此查询,并发生了什么事情。