MySQL IN子句是否多次执行子查询?
作者:互联网
鉴于MySQL中的这个SQL查询:
SELECT * FROM tableA WHERE tableA.id IN (SELECT id FROM tableB);
MySQL是否为tableA中的每一行多次执行子查询SELECT id FROM tableB?
有没有办法让sql更快,而不使用变量或存储过程?
为什么这通常比使用LEFT JOIN慢?
解决方法:
你的假设是假的;子查询只执行一次.它比连接慢的原因是因为IN无法利用索引;每次评估WHERE子句时,它必须扫描一次参数,即tableA中每行一次.您可以在不使用变量或存储过程的情况下优化查询,只需将IN替换为连接,即:
SELECT tableA.field1, tableA.field2, [...]
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
除非你不介意从两个表中取回每个字段,否则你需要在SELECT子句中枚举你想要的字段;例如,tableA.*将引发语法错误.
标签:mysql,database-performance 来源: https://codeday.me/bug/20190718/1492321.html