如何使用索引进行BETWEEN两列的查询过滤

时间:2013-12-26 16:27:45

标签: mysql sql oracle postgresql indexing

我需要一个可以在mysql,postgres和其他主要数据库上运行的连接的通用SQL查询。

我有一个名为autumn4.ip的表格,其中有三列:id, start, end(所有整数)。

如何进行连接以便我不是通过BETWEEN而是通过JOIN来使用BUT?

喜欢(伪):

SELECT * FROM autumn.ip WHERE :number-constant >= start
ORDER BY start DESC LIMIT 1;

SELECT * FROM autumn.ip WHERE :number-constant <= end
ORDER BY start ASC LIMIT 1;

如何加入上述两个查询以获得相同的内容:

SELECT * FROM autumn4.ip WHERE :number-constant BETWEEN START AND END LIMIT 1;

我正在尝试在startend上使用2个索引。如果我在(start, end)上使用BETWEEN和/或复合索引,则仅使用start index而不是end。现在请不要告诉我,我错了。我只想这样。我对此做了很多研究。

如果我为start和end创建单个索引,则只使用一个。我正在寻找一个使用两者的查询。

2 个答案:

答案 0 :(得分:0)

诀窍是以 DESCENDING 顺序在复合索引中添加第二列。

使用基本的b-tree索引,这将在 PostgreSQL 中使用(如果满足一些一般先决条件):

CREATE INDEX foo ON autumn.ip (col_start, col_end DESC)

一般主体应该适用于任何具有b-tree索引的RDBMS。

此外,对于像你这样的范围查询,GiST索引在PostgreSQL中可能更有效。考虑这个密切相关的答案:
PostgreSQL index not used for query on range

除此之外:从不使用start end或{{1}}作为标识符,尤其是在您尝试与多个RDBMS保持兼容的情况下。

答案 1 :(得分:0)

一个简单的

SELECT * FROM autumn.ip WHERE :number-constant >= start
ORDER BY start DESC LIMIT 1
UNION
SELECT * FROM autumn.ip WHERE :number-constant <= end
ORDER BY start ASC LIMIT 1;

应该有用。

但是,让我质疑你的研究质量......