考虑这个测试设置:
CREATE TABLE dept (deptid integer PRIMARY KEY, deptname TEXT);
CREATE INDEX dept_name_idx on dept(deptname);
dept
表包含1000行,deptname
列包含10个均匀分布的唯一值。
以下两个示例查询中的哪一个将使用索引dept_deptname_idx
?
1)SELECT deptid from dept where deptname ='SAPA';
2)SELECT deptid from dept where deptname <>'SAPA';
答案 0 :(得分:2)
只有 10 不同的值,均匀分布,很可能 查询都不会使用索引。在检索超过大约5%的所有行时,对表的顺序扫描通常比涉及任何索引更快。确切的数字取决于许多细节。
此外,您的示例中的1000个小行适合充满数据页的手。如此小的表格很难打败顺序扫描。
在deptname
中有一个更大的表和/或更明显的值,查询1 将是使用索引的候选者,但不是查询2 (检索大多数行并始终使用顺序扫描)。
要优化查询1的读取性能,您可以在(deptname, deptid)
上使用多列索引 - 如果符合index-only scans的前提条件。