在postgres或Mysql中是否可以创建一个索引来帮助同一个表中两列之间的范围比较?
例如,我有一个名为Test
的表,其中有3列:id
,col1
和col2
,并且它有2000万行。查询如下所示:
SELECT id,col1,col2 from Test where col1 < col2;
查询计划程序说它在整个表中使用顺序扫描。像这样的索引会起作用吗?:
CREATE INDEX idx_test on Test(col1,col2);
我已经创建了它,但查询规划器仍然执行顺序扫描。
有没有办法增强查询以减少执行时间?
答案 0 :(得分:8)
是。使用数学,路易斯!
重新调整查询,以便所有列都显示在过滤器的一侧(我基本上做了等效转换-col2
):
SELECT id,col1,col2 from Test where col1 - col2 < 0;
在该表达式上添加索引:
CREATE INDEX idx_test on Test (col1-col2);
该索引仅适用于PostgreSQL,但不适用于MySQL。根据您的整体系统负载,另一个索引策略可能仍然会更好。此索引仅对col1
或col2
上的查询无法使用。
参考文献: