为什么NOT IN条件比MySQL中的IN慢?

时间:2015-01-12 14:14:11

标签: mysql

几天前,我在接受采访时被问到这个问题。这种缓慢的原因是什么?

3 个答案:

答案 0 :(得分:2)

由您的数据决定。

我找到了另一个答案:

  

使用“IN”,因为它最有可能使DBMS在其上使用索引   相应栏目。

     

“NOT IN”理论上也可以转化为索引用法,但是   以更复杂的方式,DBMS可能不会“花费开销时间”   使用

来自:https://stackoverflow.com/a/16892027/3444315

答案 1 :(得分:1)

根据documentation,带有常量列表的in实现二进制搜索:

  

然后使用二分搜索完成对项目的搜索。这个   如果IN值列表完全由IN组成,则表示IN非常快   常数。

未明确声明NOT IN的处理方式相同,但基于此假设是合理的:

  
      
  • expr NOT IN(value,...)
  •   
     

这与NOT(expr IN(value,...))相同。

这会在性能方面留下两个可能的差异。第一个是索引使用。因为NOT IN被记录为主要使用IN,所以我希望索引优化是相同的。这是一种期望,但可能不正确。

第二,与NOT IN的比较与IN的比较较少。这将导致NOT IN更快 - 但鉴于MySQL使用的二进制搜索方法,差异小于微观。换句话说,这不应该有所作为。

最后,如果你使用的是子查询,那么所有的赌注都会被取消。 NOT IN必须处理整个列表以检查该值是否真的不在列表中。 IN可以在第一场比赛时停止处理。在某些情况下,这可能会对绩效产生影响。

答案 2 :(得分:1)

因为NOT IN只是NOT (IN)。它总是比IN多一步。 NOT ININ的结果然后否定它。