值基本相同的列的最佳索引
我們有一個整數列,目前僅包含 0 或 1 個值。開發人員現在在某些情況下使用此列來儲存唯一的 32 位標識符,我們需要能夠有效地提取包含這些標識符中的任何一個的行。
鑑於值將是 0 或 1 說(我還沒有數字) 99% 的時間,如何最好地索引來查詢少數情況?我是否認為共同價值觀的數量會成為問題?
Column | Type | Modifiers ----------------------------+---------+-------------------- event_value | integer | not null
此列目前沒有索引。而且我不認為需要定期選擇 0 或 1 值。
該表大小合理,目前有 3000 萬行並且增長迅速。
我很欣賞這不是該專欄的最佳用途,但這在短期內不會改變。
首先,就像您自己說的那樣,不是最好使用該列。應該是您的“32 位標識符”的單獨列
boolean
。integer
如果這是NULL
99% 的時間,那沒問題。NULL
儲存非常便宜。無論哪種方式,您絕對應該使用部分索引。(這是手冊中使用的正確術語。)從索引中排除 99 % 的行會使其大大縮小,這對於數百萬行的性能很重要。
但是,如果您有一個完整的索引
event_value
,並且您的常見查詢正在檢索單行,例如:SELECT * FROM tbl WHERE event_value = 123;
…那麼額外的部分指數不會買太多。它仍然會被使用,因為它仍然會快一點,但不會比完整索引快多少。額外指數的成本可能超過收益。
雖然稀有值是“32 位標識符”,但假設它們都 > 1 可能是不正確的。Postgres 使用有符號整數,並且 32 位實體也將涵蓋負數。(我們甚至可以排除
0
或1
作為這些標識符之一嗎?)如果也可以有負值: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
有關的: