以下是我的表模式:-
+---------+---------+----------+
| 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
都不会利用该索引。我现在该怎么做才能利用索引?
这些查询应该利用多列索引:table(col2, col1)
用于第一个,table(col1, col2)
用于第二个。
is not null
不使用索引的原因是,大多数值可能不是null。这意味着,与只读取所有记录并在读取后进行筛选相比,查询引擎认为使用索引获取数据没有任何优势。
还要注意,小表上的索引使用并不能代表大表上的情况。