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