使用in
运算符会影响索引的使用吗?例如,是否有可能WHERE id IN (10)
导致优化器忽略索引?
具体来说,我试图从 StackOverflow中理解这个答案。问题询问为什么没有使用索引(在 MySQL 中),答案表明这可能是由于in
仅使用了一个值。例如WHERE id IN (10)
,可能会忽略索引,但WHERE id=10
会很好。
我在 Google 上简单地浏览了一下,并浏览了一些 MySQL 文档,但我找不到任何关于in
影响优化器决定使用索引的参考。既不是单个值,也不是多个值。
假设这些IN
值与它们正在比较的列的数据类型相同,它们会影响索引的使用吗?
我链接到的问题是针对 MySQL 的,但我在其他数据库中工作,所以我很想知道这是否是关于索引的普遍注意事项,或者它是否是 MySQL 的一个怪癖。
如果这种情况发生在 MySQL 中,那么它就是 MySQL 的一个怪癖。由于您还询问了其他数据库,因此我决定在我的 postgres 数据库上对其进行测试。在一个有超过 7000 万行的表上,它为以下两个查询(使用索引)生成完全相同的解释:
这是:
在我在列表中添加多个元素之前,它不会发散:
这是(分别):
我会对他的回答持保留态度。
IN
单个项目变成=
优化器的第一个“步骤”之一。您引用的https://stackoverflow.com/questions/45989068/why-isnt-mysql-using-the-index-on-our-table(“这个答案”)并不是没有使用索引
IN
;它比这更复杂。你的问题比你意识到的更复杂。
优化器不使用索引的原因有很多
IN
。但重点应该是不要使用索引而不是in。如果你有一个特定的例子,我们可以讨论它。
此外
从 Operator_trace 中,您可能会看到“步骤”,包括“expanded_query”:“/ select#1 / select .AS from where (
tbl
. = 123456)”col2
col2
tbl
tbl
col1
作为... where col1 IN(123456)的“扩展” .