MYSQL 在使用 NOT IN 时不使用索引

标签 mysql database optimization indexing

我有一个表,其中有一个列的索引,所以这样的查询:

select * from table where id in (...)

正确使用索引。

但是如果我使用相反的方式:

select * from table where id not in (...)

则不使用索引。问题是表有超过 100,000 行,因此全表扫描的成本非常高。 NOT IN 部分不小,它可以从表中删除大约 3/4 的行,因此优化器使用这些 id 和索引来删除行并仅对其余行运行全表扫描是有意义的.但根据 EXPLAIN,这并没有发生。

有没有办法让MYSQL在第二种情况下使用索引呢?

最佳答案

我刚刚创建了一个带有随机 ID 的测试数据库,并在几行中使用了 NOT IN,但它确实使用了索引。 MySQL 可能认为在您的情况下不使用索引更好,例如由于您的 NOT IN 的分布,可能是数据类型,或者可能只是您的 MySQL 版本。

然而,可以强制查询使用索引,如 page 中所解释的那样.

在您的情况下,您的查询将变为:

select * from table FORCE INDEX (PRIMARY) where id not in (...)

关于MYSQL 在使用 NOT IN 时不使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212612/

相关文章:

mysql - 为什么哪里条件不对?

MySQL复杂的关系SELECT

sql - ASP 更新数据库,如果不存在则插入

c - 从 128 位 __m128 Intel Intrinsic 中求和 4 个整数

php - Doctrine 2 创建多个记录

php - 如何知道存储过程是否引发异常?

mysql - 什么 SQL 关系适合这里?

ruby-on-rails - 如何进行 Rails 外部数据库调用?

algorithm - 图问题松弛二分维简例的快速逼近

C++ |重用条件