强制子查询结果被扫描而不是现有结果

时间:2012-08-01 13:23:56

标签: mysql sql optimization

我可以以某种方式强制mysql对子查询结果而不是现有表进行全面扫描吗?

假设我有一个问题:

DELETE FROM table_a WHERE id IN (SELECT id FROM table_b WHERE ...)

如果我确定子查询返回~10个结果,而table_a有数千个,我可以以某种方式强制查找table_a记录,并且table_b结果要扫描吗? Mysql坚持(根据EXPLAIN SELECT * FROM table_a...)在table_a上执行ALL并在table_b上执行索引查找。

2 个答案:

答案 0 :(得分:3)

相反,您可以在字段id上添加索引并尝试INNER JOIN

DELETE a
FROM table_a a 
     INNER JOIN table_b b
         ON a.id = b.id;

答案 1 :(得分:1)

where someColumn in( ... )与正确加入相比的效率是可怕的。

在两个表上使用内连接。

避免使用in和其他不能使用索引的子句。