在同一张表中比较两列范围内的索引

7

在Postgres或MySQL中,是否可以创建一个索引来帮助同一表中两个列之间的区间比较?

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

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

查询规划器表示正在整个表中使用顺序扫描。这样的索引是否有效?
CREATE INDEX idx_test on Test(col1,col2);

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

是否有一种方法来增强查询以减少执行时间?


1
不要像之前那样创建复合索引,尝试分别在col1和col2上创建索引,看看规划器会做出什么反应。 - Rahul
@Rahul,我刚刚尝试了使用sqlite3,但是它不起作用。查询计划显示全表扫描,即使这两列都有索引。 - Good Night Nerd Pride
1个回答

10

是的。使用数学,路易斯!

重新构思查询,使得所有列都出现在筛选器的一侧(我基本上做了一个等效的转换-col2):

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

在该表达式上添加索引:

CREATE INDEX idx_test on Test ( (col1-col2) );

该索引仅适用于PostgreSQL,而不适用于MySQL。根据您的整体系统负载,另一种索引策略可能仍然更好。该索引不能用于仅查询 col1col2 的情况。

参考资料:


问题在于我无法修改查询,我只能意识到是否有一种方法可以应用索引,或者解释为什么如果没有的话。 - Luis Ibarra
1
Postgres在-上给了我一个语法错误,我不得不使用双括号来修复它:((col1-col2)) - Mr. Wonko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接