Postgresql

值基本相同的列的最佳索引

  • February 22, 2019

我們有一個整數列,目前僅包含 0 或 1 個值。開發人員現在在某些情況下使用此列來儲存唯一的 32 位標識符,我們需要能夠有效地提取包含這些標識符中的任何一個的行。

鑑於值將是 0 或 1 說(我還沒有數字) 99% 的時間,如何最好地索引來查詢少數情況?我是否認為共同價值觀的數量會成為問題?

          Column           |  Type   |     Modifiers
----------------------------+---------+--------------------
event_value                | integer | not null

此列目前沒有索引。而且我不認為需要定期選擇 0 或 1 值。

該表大小合理,目前有 3000 萬行並且增長迅速。

我很欣賞這不是該專欄的最佳用途,但這在短期內不會改變。

首先,就像您自己說的那樣,不是最好使用該列。應該是您的“32 位標識符”的單獨列booleaninteger如果這是NULL99% 的時間,那沒問題。NULL儲存非常便宜。

無論哪種方式,您絕對應該使用部分索引。(這是手冊中使用的正確術語。)從索引中排除 99 % 的行會使其大大縮小,這對於數百萬行的性能很重要

但是,如果您有一個完整的索引event_value,並且您的常見查詢正在檢索單行,例如:

SELECT * FROM tbl WHERE event_value = 123;

…那麼額外的部分指數不會買太多。它仍然會被使用,因為它仍然會快一點,但不會比完整索引快多少。額外指數的成本可能超過收益。

雖然稀有值是“32 位標識符”,但假設它們都 > 1 可能是不正確的。Postgres 使用有符號整數,並且 32 位實體也將涵蓋負數。(我們甚至可以排除01作為這些標識符之一嗎?)如果也可以有負值:

CREATE INDEX tbl_event_value_part_idx ON tbl (event_value)
WHERE event_value > 1 OR event_value < 0; -- or similar

event_value不必是索引列,無論它在 WHERE 子句中的用途如何。這完全取決於期望的查詢類型。無論哪種方式,安全的選擇是將相同的WHERE條件從字面上添加到任何應該使用索引的查詢中,即使這在邏輯上是多餘的。Postgres 可以做出非常基本的邏輯結論來確定適用的索引,但它不是人工智慧,也不會嘗試去做(很快就會變得太貴)。像:

SELECT * FROM tbl WHERE event_value > 1 OR event_value < 0

有關的:

引用自:https://dba.stackexchange.com/questions/230135