数据库
首页 > 数据库> > MySQL IN子句是否多次执行子查询?

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