IN() 中什么更好?子查询或值列表

sti*_*tix 9 mysql

如果搜索或更新行并使用 where 语句 IN() - 最好使用子查询选择值或定义值,或者这之间没有效率差异?例如:

SELECT a FROM b WHERE c IN( SELECT c FROM x )
Run Code Online (Sandbox Code Playgroud)

或者

SELECT a FROM b WHERE c IN(1,2,3,4,5,6,...hundreds values...)
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 7

如果你有一个表中的值并且该列被索引,我希望它比使用值列表更有效。请注意,有几种方法可以做到这一点 - 特别是因为这种类型的查询 ( WHERE c IN (SELECT c FROM x)) 在某些不那么旧的 MySQL 版本中没有完全优化:

SELECT a FROM b WHERE c IN ( SELECT c FROM x ) ;
Run Code Online (Sandbox Code Playgroud)

您可以将(如果x (c)没有NULL值)重写为:

SELECT a FROM b WHERE EXISTS ( SELECT 1 FROM x WHERE x.c = b.c ) ;
Run Code Online (Sandbox Code Playgroud)

或(如果x (c)有唯一值)为:

SELECT b.a FROM b JOIN x ON x.c = b.c ;
Run Code Online (Sandbox Code Playgroud)

所以,现在您有 4 个版本要测试。实际行为当然取决于更多因素(除了查询、索引、版本),如表大小、值分布、mysql 设置、可用内存、其他正在运行的查询、月相、磁盘效率等。

总之,最好的办法是在您的环境中测试所有可用选项并选择最适合您的选项。