Mysql 如何使用索引在两列之间进行查询筛选

Mysql 如何使用索引在两列之间进行查询筛选,mysql,sql,oracle,postgresql,indexing,Mysql,Sql,Oracle,Postgresql,Indexing,我需要一个通用的sql查询,用于可以在mysql、postgres和其他主要数据库上运行的连接 我有一个名为autumn4.ip的表,它有三列:id、start、end all int 如何创建联接,以便使用联接而不是中间联接 像伪: SELECT * FROM autumn.ip WHERE :number-constant >= start ORDER BY start DESC LIMIT 1; SELECT * FROM autumn.ip WHERE :number-const

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

我有一个名为autumn4.ip的表,它有三列:id、start、end all int

如何创建联接,以便使用联接而不是中间联接

像伪:

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;
我试图在开始和结束时使用两个索引。如果我在开始、结束时使用BETWEEN和/或复合索引,则只使用开始索引,而不使用结束。现在请不要告诉我我错了。我只想这样。我对此做了很多研究


如果我为开始和结束创建了单个索引,那么只会使用一个索引。我正在寻找一个同时使用两者的查询。

诀窍是在复合索引中按降序添加第二列

使用基本b-树索引,如果满足一些一般先决条件,则可在PostgreSQL中使用该索引:

CREATE INDEX foo ON autumn.ip (col_start, col_end DESC)
一般原则应适用于任何具有b树索引的RDBMS

此外,对于像您这样的范围查询,GiST索引在PostgreSQL中可能更有效。考虑这个密切相关的答案:

旁白:永远不要使用像start或end这样的标识符,尤其是当您试图与多个RDBMS保持兼容时。

一个简单的

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;
应该有用


但是,请允许我质疑您的研究质量…

请解释为什么不使用上一个查询,除了限制1之外,它是标准SQL,并且得到您提到的所有数据库的支持。我请求不要问我为什么这样做:@MasoodAhmad那么我们帮不了您,因为我们必须知道您正在尝试实现什么。我正在尝试实现的可能重复是使用两个索引,开始和结束。如果我使用BETHEN和/或start、end的复合索引。只使用开始索引,不使用结束索引。现在请不要告诉我我错了。我只想这样。我对此做了很多研究
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;