我可以以某种方式强制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上执行索引查找。
答案 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
和其他不能使用索引的子句。