CodeGym /課程 /SQL SELF /主要的索引類型: B-TREEHASH

主要的索引類型: B-TREEHASHGINGiST

SQL SELF
等級 37 , 課堂 1
開放

主要的索引類型:B-TREEHASHGINGiST

在 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 > 100ORDER 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,慢查詢掰掰!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION