我有一个表,其中有一个列的索引,所以这样的查询:
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/