【问题标题】:How to use indexes for a query filtering BETWEEN two columns如何使用索引在两列之间进行查询过滤
【发布时间】:2014-01-14 06:59:34
【问题描述】:

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

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

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

喜欢(伪):

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 和 end 创建了单个索引,则只使用一个。我正在寻找同时使用两者的查询。

【问题讨论】:

  • 请解释你为什么不使用最后一个查询,它(除了限制 1)是标准 SQL,并且你提到的所有数据库都支持。
  • 我要求“不要问我为什么这样做:)”
  • @MasoodAhmad 那么我们帮不了你,因为我们必须知道你想要完成什么
  • 我想要完成的是使用 2 个索引,开始和结束。如果我使用 BETWEEN 和/或 start、end 的复合索引。仅使用开始索引而不使用结束索引。现在请不要告诉我我错了。我只是想要那样。我对此做了很多研究

标签: mysql sql oracle postgresql indexing


【解决方案1】:

一个简单的

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;

应该可以。

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

【讨论】:

    【解决方案2】:

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

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

    CREATE INDEX foo ON autumn.ip (col_start, col_end <b>DESC</b>)

    一般原则应适用于任何具有 b-tree 索引的 RDBMS。

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

    除此之外:永远不要使用 reserved wordsstartend 作为标识符,尤其是当您试图与多个 RDBMS 保持兼容时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多