以下是我的表架构: -
+---------+---------+----------+
| ID | COL1 | COL2 |
+---------+---------+----------+
| 1 | NULL | 1 |
| 2 | 1 | NULL |
| 3 | NULL | NULL |
+---------+---------+----------+
现在,我必须运行以下查询: -
SELECT * FROM `TABLE` WHERE `COL1` IS NOT NULL AND `COL2` IS NULL
和
SELECT * FROM `TABLE` WHERE `COL2` IS NOT NULL AND `COL1` IS NULL
无论我使用什么索引,SELECT * FROM TABLE WHERE ANY_COL IS NOT NULL
都不会利用索引。我现在该怎么做才能利用索引?
答案 0 :(得分:2)
这些查询应该利用多列索引:第一个为table(col2, col1)
,第二个为table(col1, col2)
。
is not null
不使用索引的原因是因为大多数值 - 可能 - 不为空。这意味着查询引擎在使用索引获取数据方面没有任何优势,只需读取所有记录并在读取后执行过滤。
另请注意,小表上的索引使用情况并不代表较大表上发生的情况。