主要的索引類型:B-TREE、HASH、GIN、GiST
在 PostgreSQL 的世界裡有幾種索引,每一種都有它自己的專屬任務。這就像選交通工具一樣:你可以用腳踏車在公園晃晃,但要跨城就會選汽車。不同的索引就是給不同需求用的。
PostgreSQL 的主要索引類型有:
B-TREE索引:萬用型,適合大多數情境。HASH索引:專門給精確比對用。GIN索引:超適合查陣列跟 JSONB。GiST索引:拿來處理複雜資料型別,像地理資訊。
索引就是拿來加速查找資料列的。它們有 4 種不同的最佳化方式:每種都針對特定操作和資料型別特別快。
你沒辦法直接操控索引。你能做的,就是選一種索引類型:要嘛不要索引,要嘛就選上面這幾種之一。接下來我們會一個一個看,什麼時候該用哪一種。
B-TREE 索引
B-TREE(就是 "balanced tree" 的縮寫)是最常見的索引,也是 PostgreSQL 的基礎。這種索引會建一個樹狀結構,把資料排好,讓查找、排序、過濾都超快。
想像一下圖書館的書架,每個書架上的書都按字母順序排好。你要找 "M" 開頭的書,不用一本本翻,直接從中間找起就好。B-TREE 就是這種平衡樹的概念。
什麼時候該用?
幾乎隨時都能用!B-TREE 索引特別適合:
- 範圍查找:
WHERE price > 100。 - 排序:
ORDER BY name ASC。 - 等值查找:
WHERE id = 42。
來個建立索引的例子:
-- 幫 products 表的 price 欄位建 B-TREE 索引:
CREATE INDEX idx_price ON products(price);
之後你查詢像 WHERE price > 100,PostgreSQL 就會用這個索引,不用整張表慢慢掃。
HASH 索引
HASH 索引用 hash table 來加速查找。它最強的地方就是精確比對。不過 HASH 索引有個限制:不支援範圍查找或排序。
這就像一個卡片櫃,每張卡片都有明確的編號。你要找 42 號卡片,管理員馬上就能給你。但你要說:「給我 40 到 50 號的卡片」,他就沒辦法。
HASH 索引只適合精確查找:
WHERE email = 'user@example.com'。SELECT ... WHERE id = 123。
如果你要查範圍或排序,HASH 就不適合了。
建立方式:
-- 幫 users 表的 email 欄位建 hash 索引:
CREATE INDEX idx_email_hash ON users USING HASH (email);
這樣 PostgreSQL 查 WHERE email = 'user@example.com' 時就會用這個索引。
注意: HASH 索引只適合很特定的情境,比 B-TREE 用得少。
GIN(Generalized Inverted Index)索引
GIN 是專門給陣列、JSONB 跟文字資料用的索引,真的很神奇。想像你有個櫃子,裡面有上千個抽屜,每個抽屜都貼了標籤。像「蘋果」抽屜就全是蘋果,「香蕉」抽屜就全是香蕉。你要找蘋果或香蕉,不用翻全部,直接找對的抽屜就好。
GIN 索引適合:
- 查陣列:
@>(包含)、<@(被包含)。 - JSONB 資料:
WHERE jsonb_data @> '{"key": "value"}'。
建立範例
-- 幫 products 表的 tags 欄位(陣列)建 GIN 索引:
CREATE INDEX idx_tags_gin ON products USING GIN (tags);
這樣 PostgreSQL 查找像「標籤是 '電子產品' 和 '推薦'」的商品就超快。
GiST(Generalized Search Tree)索引
GiST 索引超強,專門處理複雜型別,像地理座標、範圍。它會建一棵樹,專門給空間查找和範圍查找加速。
想像一張城市地圖,每個點都標好座標。你要找 5 公里內的所有點,超快。
GiST 適合:
- 地理資料:
SELECT ... FROM locations WHERE ST_DWithin(geom, point, distance)。 - 範圍查找:
WHERE date_range && '[2023-01-01, 2023-12-31]'。
範例:
-- 幫 places 表的 location 欄位(地理資料)建 GiST 索引:
CREATE INDEX idx_location_gist ON places USING GiST (location);
這樣就能做很複雜的地理查詢,比如找最近的點。
索引比較表
| 索引類型 | 適合... | 使用範例 | 備註 |
|---|---|---|---|
B-TREE |
範圍查找、排序 | price > 100、ORDER BY name ASC |
萬用型索引。 |
HASH |
精確等值比對 | email = 'user@example.com'、id = 42 |
不支援範圍查找。 |
GIN |
陣列、JSONB | tags @> '{tech}'、jsonb_data @> '{"key": "value"}' |
複雜資料查找更快。 |
GiST |
地理、範圍、距離 | ST_DWithin(geom, point, distance) |
專門給地理資料用。 |
現在你已經認識 PostgreSQL 的主要索引類型和用法啦。記住:選索引就是戰略決策,會直接影響查詢速度。Checkmate,慢查詢掰掰!
GO TO FULL VERSION