iT邦幫忙

2025 iThome 鐵人賽

DAY 1
4

https://ithelp.ithome.com.tw/upload/images/20250901/20177885qnRDquv25l.png

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

https://ithelp.ithome.com.tw/upload/images/20250805/20177885Cabhr8dKP8.png

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

https://ithelp.ithome.com.tw/upload/images/20250805/201778852FOOpFd2jN.png

只是剛轉職的時候遇到這樣的事,內心還是很緊張,從那時候就覺得一定要把資料庫學好,不想再收到類似的訊息嚇自己了!

因為工作上是使用 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 並查看版本記錄

寫完這個系列後,對自己的期許是:

  1. 面對資料庫設計時,不再猶豫與害怕,能夠自信地做出決策。
  2. 了解 PostgreSQL 的底層運作機制,能夠清楚解釋每個設計選擇背後的原因。
  3. 不要再因為 Index 這種東西被 PM 的訊息嚇到了 /images/emoticon/emoticon02.gif

也希望這系列文章能幫助你,在面對資料庫優化時,少踩一些坑!
讓我們一起開始這場 PostgreSQL 的學習之旅吧~


下一篇
Day 2 - 使用 Index 提升查詢速度
系列文
PostgreSQL 效能優化 30 天挑戰:從 Index 到 Transaction 的深入探索2
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言