两列中的索引在同一表中进行范围比较

时间:2014-08-01 03:39:44

标签: sql indexing

在postgres或Mysql中是否可以创建一个索引来帮助同一个表中两列之间的范围比较?

例如,我有一个名为Test的表,其中有3列:idcol1col2,并且它有2000万行。查询如下所示:

SELECT id,col1,col2 from Test where col1 < col2;

查询计划程序说它在整个表中使用顺序扫描。像这样的索引会起作用吗?:

CREATE INDEX idx_test on Test(col1,col2);

我已经创建了它,但查询规划器仍然执行顺序扫描。

有没有办法增强查询以减少执行时间?

1 个答案:

答案 0 :(得分:8)

是。使用数学,路易斯!

重新调整查询,以便所有列都显示在过滤器的一侧(我基本上做了等效转换-col2):

SELECT id,col1,col2 from Test where col1 - col2 < 0;

在该表达式上添加索引:

CREATE INDEX idx_test on Test (col1-col2);

该索引仅适用于PostgreSQL,但不适用于MySQL。根据您的整体系统负载,另一个索引策略可能仍然会更好。此索引仅对col1col2上的查询无法使用。

参考文献: