
第一次參加鐵人賽,為什麼會選擇資料庫作為主題呢?要從一個菜鳥工程師的故事開始說起,記得剛開始轉職成為後端工程師,工作差不多滿三個月的時候,有一次收到 PM 傳來一個功能壞掉的訊息:

當下有點緊張的跟 PM 要使用者的訊息跟情境,一邊趕快找 log 看發生什麼事。後來在 log 找到 timeout 的訊息。還好那時候產品的使用者還沒有很多,跑去跟主管討論之後,我們把特定欄位加上 Index,功能也恢復正常了,恢復世界和平的一天~

只是剛轉職的時候遇到這樣的事,內心還是很緊張,從那時候就覺得一定要把資料庫學好,不想再收到類似的訊息嚇自己了!
因為工作上是使用 PostgreSQL,所以就以 PostgreSQL 當作學習的目標,這 30 天會跟著官方文件的腳步一起來閱讀學習,文章裡面有 Quote 的部分就會是官方文件內的敘述。除了閱讀文件之外,也會文件內容一起測試做實驗,透過這樣的方式可以讓我自己更理解運作方式。最終目標是希望自己可以更熟悉的設計資料庫,而且可以清楚的表達出來每個設計決策背後的原理!
文章規劃
Index
- Day 2 - 使用 Index 提升查詢速度
- Day 3 - PostgreSQL 中的 B-Tree Index
- Day 4 - Multi-Column Index:順序對效能的影響
- Day 5 - Index Scan 與 Bitmap Scan
- Day 6 - 如何用 Index 加速 ORDER BY?
- Day 7 - 確保資料唯一性:UNIQUE Index
- Day 8 - Expression Index:Index 不只能針對欄位
- Day 9 - Partial Index:只幫必要資料加 Index
- Day 10 - Index-Only Scan:不會碰觸到 Heap 的 Index
- Day 11 - Visibility Map 與 Index-Only Scan 的關係
- Day 12 - VACUUM 資料回收機制
- Day 13 - 提升 JSONB 查詢效能:使用 GIN 與 jsonb_path_ops
- Day 14 - Full Text Search:選擇 GIN 還是 GiST?
- Day 15 - PostgreSQL 也可以模糊搜尋 :pg_trgm
- Day 16 - GiST / SP-GiST:加速空間範圍查詢
- Day 17 - 時間序列資料適用的 Index:BRIN
-
Day 18 - CREATE INDEX CONCURRENTLY:不影響業務的情況下建立 Index
Transaction & Isolation Levels
- Day 19 - Isolation Levels:交易同時進行時,怎麼避免資料錯亂?
- Day 20 - 觀察 PostgreSQL 隔離層級:Read Committed、Repeatable Read
- Day 21 - 觀察 PostgreSQL 隔離層級:Serializable
Lock
- Day 22 - Table Lock 是什麼?什麼時候會遇到它?
- Day 23 - Row Level Lock:FOR SHARE 讀鎖的應用與實驗
- Day 24 - Row Level Lock:FOR UPDATE 寫鎖的應用與實驗
- Day 25 - Deadlock:當交易互相卡住,該怎麼辦?
Performance Optimization
- Day 26 - Slow Query Log:找出拖慢系統的 SQL 查詢
- Day 27 - PostgreSQL 的 JOIN 機制:Nested Loop、Hash Join、Merge Join
Migrations - Alembic
- Day 28 - 使用 FastAPI + SQLModel 定義 Table 與 Index
- Day 29 - 在 FastAPI 中使用 Alembic 進行資料庫遷移
- Day 30 - 用 Alembic 自動產生 Migration 並查看版本記錄
寫完這個系列後,對自己的期許是:
- 面對資料庫設計時,不再猶豫與害怕,能夠自信地做出決策。
- 了解 PostgreSQL 的底層運作機制,能夠清楚解釋每個設計選擇背後的原因。
- 不要再因為 Index 這種東西被 PM 的訊息嚇到了
也希望這系列文章能幫助你,在面對資料庫優化時,少踩一些坑!
讓我們一起開始這場 PostgreSQL 的學習之旅吧~