Mysql查询IN或NOT IN更快?

nbysray5  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(245)

下面我有两个简单的问题:

SELECT * from table_name where status IN (0, 1, 2, 3, 4)
SELECT * from table_name where status NOT IN (5, 6)

字符串
status的可能值为0到6,列status被索引。
在上面的查询中,WHERE IN有5种状态,但WHERE NOT IN只有2种状态。我的数据库中没有太多数据,所以查询速度没有任何不同。
但是如果数据很大,哪种查询会更快呢?

xzlaal3s

xzlaal3s1#

在我看来,

  • WHERE IN查询可能会更快,特别是在状态列被索引的情况下。这是因为带有值列表的IN条件可以利用索引快速定位匹配的行。另一方面,具有较少值的NOT IN条件可能仍然受益于索引,但可能需要扫描索引的更大部分。
  • 如果您的数据集很大,并且状态列已被索引,则首选WHERE IN查询以获得更好的性能。
klsxnrf1

klsxnrf12#

如果状态列只有7个值(0到6),那么索引根本不会被使用,因为基数太低。优化器将执行表扫描(甚至索引文件也不会被扫描,因为您选择的列比状态列多)。
假设状态值的均衡分布,NOT IN子句将更快,因为它具有更小的范围:最多必须检查2个不同的值,而IN子句最多必须检查5个不同的值。

select benchmark(10000000, floor(rand() * 7) in (0,1,2,3,4));
0.423 sec

select benchmark(10000000, floor(rand() * 7) not in (5,6));
0.363 sec

字符串

4nkexdtk

4nkexdtk3#

子句IN和NOT IN都是性能密集型的,因为结果取决于操作中使用的数据集的大小。然而,优化的方法取决于使用JOIN运算符或EXISTS或NOT EXISTS子查询,并且索引列将给予显著的性能改进。

相关问题