要回答这个问题并不容易。您应该知道一件事:MySQL将
IN (<static values list>)和
IN(<subquery>)视为不同的查询。第一个等于 范围比较 (如
.. OR = .. OR =),而第二个等于
= ANY()-,并且不相同。因此,简而言之:
IN与subquery一起使用将导致with查询,
ANY()而MySQL不会为此使用index,即使subquery是独立的并返回
静态值列表 。伤心,但真实。MySQL无法预测到这一点,因此即使显而易见,也不会使用索引。如果使用
JOIN(即重写
IN(<subquery>)),则MySQL将使用index作为
JOIN条件(如果可能)。
现在,第二种情况可能
JOIN与
IN使用分区有关。如果您将使用
JOIN-那么,可悲的是-但MySQL
JOIN在通常情况下也无法预测分区-
它将使用整个分区集。替换
JOIN为
IN (<static list>)会改变
EXPLAINPARTITION情况:MySQL将仅使用那些在
IN子句中指定的从范围中选择值所需的分区。但是,这再次不适用于
IN (<subquery>)。
得出一个结论-令人遗憾的是,当我们谈论MySQL如何处理
IN子查询时-
在通常情况下,不能
JOIN安全地替换它(这是关于分区的情况)。因此,常见的解决方案是: 在应用程序级别将子查询与主查询分开
。如果我们说的是独立子查询,返回静态值列表,那是最好的建议-那么您可以将该值列表替换为as
IN(<staticlist>)并获得好处:MySQL将为其使用索引,并且,如果我们说的是分区,则实际上从他们需要的将被使用。



