天天看點

pg中多值列_postgresql – 多列索引和性能

回答

由于您參考網站use-the-index-luke.com,請考慮以下章節:

它有一個完美比對你的情況的例子(雙列索引,一個測試相等,另一個測試範圍),解釋(更多那些漂亮的索引圖形)為什麼@ypercube’s advice是準确的并總結起來:

Rule of thumb: index for equality first — then for ranges.

隻有一列好嗎?

對于隻有一列的查詢,該做什麼似乎很清楚.關于這些相關問題的更多細節和基準:

選擇性較低的列首先?

除此之外,如果兩個列隻有相同的條件怎麼辦?

沒關系.把列放在第一位,更有可能獲得自己的條件,這實際上很重要.

考慮這個示範,或自己重制.我建立了一個包含100k行的兩列簡單表.一個很少,另一個有很多不同的值:

CREATE TEMP TABLE t AS

SELECT (random() * 10000)::int AS lots,(random() * 4)::int AS few

FROM generate_series (1,100000);

DELETE FROM t WHERE random() > 0.9; -- create some dead tuples,more "real-life"

ANALYZE t;

SELECT count(distinct lots) -- 9999,count(distinct few) -- 5

FROM t;

查詢:

SELECT *

FROM t

WHERE lots = 2345

AND few = 2;

EXPLAIN ANALYZE輸出(排除緩存效果的最佳值為10):

Seq Scan on t (cost=0.00..5840.84 rows=2 width=8)

(actual time=5.646..15.535 rows=2 loops=1)

Filter: ((lots = 2345) AND (few = 2))

Buffers: local hit=443

Total runtime: 15.557 ms

添加索引,重新測試:

CREATE INDEX t_lf_idx ON t(lots,few);

Index Scan using t_lf_idx on t (cost=0.00..3.76 rows=2 width=8)

(actual time=0.008..0.011 rows=2 loops=1)

Index Cond: ((lots = 2345) AND (few = 2))

Buffers: local hit=4

Total runtime: 0.027 ms

添加其他索引,重新測試:

DROP INDEX t_lf_idx;

CREATE INDEX t_fl_idx ON t(few,lots);

Index Scan using t_fl_idx on t (cost=0.00..3.74 rows=2 width=8)

(actual time=0.007..0.011 rows=2 loops=1)

Index Cond: ((few = 2) AND (lots = 2345))

Buffers: local hit=4

Total runtime: 0.027 ms