簡體   English   中英

在 PostgreSQL 中創建多列索引

[英]Creating multicolumn indexes in PostgreSQL

我現在正在研究為我們的表創建索引。

我發現了多列索引,但不確定其影響。 例子:

我們在findByIdfindByIdAndStatusfindByResult上有 SQL。

它說在WHERE上最常用的應該列在列列表的第一位。 但我想知道如果我在不同的組合 where 子句上創建索引是否會產生巨大影響。

這:(為所有人創建一個索引)

CREATE INDEX CONCURRENTLY ON Students (id, status, result)

對比

這:(在不同的查詢上創建不同的索引)

CREATE INDEX CONCURRENTLY ON Students (id)

CREATE INDEX CONCURRENTLY ON Students (id, status)

CREATE INDEX CONCURRENTLY ON Students (result)

非常感謝您!

為所有人創建一個索引和創建不同的索引將對查詢產生完全不同的影響。

  1. 您可以使用 EXPLAIN 查看索引是否被用於查詢。

  2. 該視頻非常適合了解數據庫索引。

  3. Index CREATE INDEX CONCURRENTLY ON Students (id, status, result) 僅當查詢在 WHERE 子句中使用 id, (id,status) 或 (id, status and result) 時使用。 狀態為 Where 的查詢根本不會使用該索引。

索引基本上是平衡二叉樹。 多列索引將按 id 索引行,然后按 id 排序的行是按狀態進一步索引,然后是結果等等。 您可以看到,在此索引中,根本不存在通過狀態進行排序。 它僅適用於由 id 的第一個索引的行。

一定要看看視頻,它很好地解釋了這一切。

您閱讀的經驗法則是錯誤的。
一個更好的規則是:只有當它有用並且被使用得足夠頻繁時,才創建這樣的索引,以至於值得每個索引附帶的數據修改的性能損失。

(a, b, c)上的多列 B 樹索引在以下幾種情況下很有用:

  1. 如果查詢如下所示:

     SELECT... FROM tab WHERE a = $1 AND b = $2 AND c <operator> $3

    其中<operator>是索引支持的運算符, $1$2$3是常量。

  2. 如果查詢如下所示:

     SELECT... FROM tab WHERE a = $1 AND b = $2 ORDER BY c;

    或者像這樣

    SELECT... FROM tab WHERE a = $1 ORDER BY b, c;

    ORDER BY子句中的任何修飾都必須反映在CREATE INDEX語句中。 例如,對於ORDER BY b, c DESC ,必須在(a, b, c DESC)(a, b DESC, c)上創建索引(可以雙向讀取索引)。

  3. 如果查詢如下所示:

     SELECT c FROM tab WHERE a = $1 AND b <operator> $2;

    如果表是新的VACUUM ed,這可以讓你只掃描索引,因為所有需要的信息都在索引中。

    在最近的 PostgreSQL 版本中,這樣的索引最好創建為

    CREATE INDEX ON tab (a, b) INCLUDE (c);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM