你之前應該有遇過索引啦。今天我們就來好好聊聊,讓你完全搞懂它們的運作細節。索引超讚的,能讓你的查詢快上幾百甚至幾千倍。你一定會愛上它。但索引到底是什麼?
想像一下你在一個超大圖書館裡找一本書。如果沒有任何搜尋規則,這件事可能會花掉你一輩子。為了加快速度,書通常會按字母或分類排好。資料庫裡的索引就是這個概念。
正式來說,索引是一種特別的額外資料結構,專門用來讓你能很快地在資料表裡找到資料列。 它能減少你為了找到資訊需要瀏覽的資料量。
某種程度上,索引就像百科全書的目錄,如果把整本書想成一個資料表的話。
你不用從頭到尾翻整本百科全書,只要用目錄就能直接跳到你要的頁面。
想像一下,employees 這個表有十萬個員工。如果你要找姓「明」的員工,沒有索引你就得一筆一筆看(超慢)。有索引的話,Postgres 會知道去哪裡找,速度快很多。
索引怎麼運作?
要懂索引怎麼加速查詢,你得知道它們在幕後做了什麼。索引是根據一個或多個欄位建立的,然後把資料組成一個很適合搜尋的結構。
PostgreSQL 的索引最常用的資料結構是 B-Tree(平衡樹)。它的運作方式大概是這樣:
- 建立索引:把你指定的欄位資料組成一棵樹。
- 查找時:PostgreSQL 用索引來快速找到你要的資料列,不用掃整張表。
- 樹狀結構:樹是有順序的,這讓你可以很快地從一筆跳到另一筆(就是 binary search 演算法)。
舉例來說,假設我們有一百萬筆資料的表。沒索引你得查一百萬次。有索引的話,PostgreSQL 只要查幾十次就搞定。
什麼時候該用索引?
索引能大幅提升讀取操作的速度,比如:查找、篩選、排序。但這是有代價的,因為寫入操作(像 INSERT、UPDATE、DELETE)會變慢,因為每次資料變動都要更新索引。
哪些情境一定要用索引
常常查找資料: 如果你常常根據某個值查找資料,比如:
SELECT * FROM employees WHERE last_name = '明';
資料篩選: 如果你在 WHERE 或 HAVING 條件裡用到:
SELECT * FROM employees WHERE salary > 50000;
資料排序: 用 ORDER BY 的時候:
SELECT * FROM employees ORDER BY hire_date DESC;
資料表連接(JOIN): 如果你常常根據某些欄位把表連起來。
*什麼時候*不該用索引
- 如果表很小(比如只有 10-50 筆),加索引沒什麼感覺。
- 如果你很少根據那個欄位查詢。
- 如果那個欄位的值很少變化(像
gender只有 2-3 種)。
舉例:在 status 欄位只有「啟用」和「未啟用」兩種值時加索引,其實沒什麼意義。
索引對效能的影響
你應該已經發現,索引能加速讀取查詢,但會拖慢寫入。因為每次加、改、刪資料時,PostgreSQL 都要同步更新索引。
索引數量跟效能的平衡
- 如果表常常在改資料,索引不要加太多。
- 如果表主要是查資料,索引一定要加。
索引在現實生活的好處
實際上,索引常常被用來:
- 優化 web 應用:讓 SQL 查詢超快,網頁載入也快。
- 處理大表:沒有索引的話,查詢幾百萬筆資料會慢到爆。
- 擴展性:索引讓你能有效處理大量資料。
比如說,一個網路商店的商品和訂單資料庫沒索引的話,客戶可能要等到天荒地老才看到網頁。
GO TO FULL VERSION