下面我有两个简单的问题:
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种状态。我的数据库中没有太多数据,所以查询速度没有任何不同。但是如果数据很大,哪种查询会更快呢?
xzlaal3s1#
在我看来,
IN
NOT IN
WHERE IN
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
字符串
4nkexdtk3#
子句IN和NOT IN都是性能密集型的,因为结果取决于操作中使用的数据集的大小。然而,优化的方法取决于使用JOIN运算符或EXISTS或NOT EXISTS子查询,并且索引列将给予显著的性能改进。
3条答案
按热度按时间xzlaal3s1#
在我看来,
IN
查询可能会更快,特别是在状态列被索引的情况下。这是因为带有值列表的IN
条件可以利用索引快速定位匹配的行。另一方面,具有较少值的NOT IN
条件可能仍然受益于索引,但可能需要扫描索引的更大部分。WHERE IN
查询以获得更好的性能。klsxnrf12#
如果状态列只有7个值(0到6),那么索引根本不会被使用,因为基数太低。优化器将执行表扫描(甚至索引文件也不会被扫描,因为您选择的列比状态列多)。
假设状态值的均衡分布,NOT IN子句将更快,因为它具有更小的范围:最多必须检查2个不同的值,而IN子句最多必须检查5个不同的值。
字符串
4nkexdtk3#
子句IN和NOT IN都是性能密集型的,因为结果取决于操作中使用的数据集的大小。然而,优化的方法取决于使用JOIN运算符或EXISTS或NOT EXISTS子查询,并且索引列将给予显著的性能改进。