目錄
資料庫知識體系目錄
完整的資料庫學習筆記索引,涵蓋基礎到進階的所有重要概念。
📚 目錄結構
1. 資料庫基礎概念
- 1.1 什麼是資料庫
- 1.2 關聯式資料庫 vs 非關聯式資料庫
- 1.3 SQL vs NoSQL
- 1.4 常見資料庫系統(PostgreSQL、MySQL、MongoDB、Redis)
- 1.5 資料庫的 ACID 特性
2. 交易與並發控制 (Transactions & Concurrency)
2.1 交易基礎
- 2.1.1 什麼是交易(Transaction)
- 2.1.2 BEGIN、COMMIT、ROLLBACK
- 2.1.3 交易的 ACID 特性詳解
- Atomicity(原子性)
- Consistency(一致性)
- Isolation(隔離性)
- Durability(持久性)
2.2 隔離層級 (Isolation Levels) ⭐
2.2.1 並發問題
- 髒讀(Dirty Read)
- 不可重複讀(Non-Repeatable Read)
- 幻讀(Phantom Read)
- 寫入偏差(Write Skew)
2.2.2 四個隔離層級
- Read Uncommitted(讀取未提交)
- Read Committed(讀取已提交)
- Repeatable Read(可重複讀)
- Serializable(可序列化)
2.2.3 各隔離層級的使用場景
- 銀行系統
- 電商系統
- 社交媒體
- 股票交易
2.2.4 不同資料庫的實作差異
- PostgreSQL 的 MVCC
- MySQL InnoDB 的實作
- 快照隔離(Snapshot Isolation)
2.2.5 實務應用
- 何時更改隔離層級
- 生產環境的最佳實踐
- 混合策略
2.3 鎖機制 (Locking)
2.3.1 悲觀鎖(Pessimistic Locking)
- SELECT FOR UPDATE
- 共享鎖(Shared Lock)
- 排他鎖(Exclusive Lock)
- 使用場景與範例
2.3.2 樂觀鎖(Optimistic Locking)
- 版本號機制
- 時間戳機制
- CAS(Compare-And-Swap)
- 衝突處理與重試策略
2.3.3 死鎖(Deadlock)
- 什麼是死鎖
- 死鎖的四個必要條件
- 如何預防死鎖
- 死鎖偵測與處理
2.3.4 鎖的粒度
- 表級鎖(Table Lock)
- 行級鎖(Row Lock)
- 頁級鎖(Page Lock)
3. 索引 (Indexing) ⭐
3.1 索引基礎
- 3.1.1 什麼是索引
- 3.1.2 索引的運作原理
- 3.1.3 索引的好處與壞處
- 3.1.4 何時需要索引、何時不需要
3.2 索引類型
3.2.1 B-Tree 索引
- 資料結構原理
- 查找過程
- 適用場景
3.2.2 Hash 索引
- 原理與限制
- 適用場景
3.2.3 單欄索引 vs 複合索引
- 最左前綴原則
- 複合索引的順序選擇
3.2.4 唯一索引(Unique Index)
3.2.5 部分索引(Partial Index)
3.2.6 全文索引(Full-Text Index)
3.2.7 空間索引(Spatial Index)
3.3 索引優化
- 3.3.1 使用 EXPLAIN 分析查詢計劃
- 3.3.2 索引選擇性(Selectivity)
- 3.3.3 索引覆蓋(Covering Index)
- 3.3.4 索引合併(Index Merge)
- 3.3.5 索引失效的情況
- 3.3.6 索引維護(REINDEX、OPTIMIZE)
3.4 實務案例
- 3.4.1 電商商品搜尋索引設計
- 3.4.2 社交媒體貼文索引設計
- 3.4.3 訂單系統索引設計
- 3.4.4 索引效能測試與對比
4. 查詢優化 (Query Optimization)
4.1 查詢基礎
4.1.1 SELECT 查詢的執行順序
4.1.2 JOIN 的類型與原理
- INNER JOIN
- LEFT/RIGHT JOIN
- FULL OUTER JOIN
- CROSS JOIN
4.1.3 子查詢 vs JOIN
4.1.4 聚合函數(COUNT、SUM、AVG、MAX、MIN)
4.1.5 GROUP BY 和 HAVING
4.2 查詢優化技巧
- 4.2.1 避免 SELECT *
- 4.2.2 使用 LIMIT 限制結果
- 4.2.3 避免在 WHERE 中使用函數
- 4.2.4 使用 EXISTS 代替 IN
- 4.2.5 分頁查詢優化
- 4.2.6 避免隱式類型轉換
4.3 執行計劃分析
- 4.3.1 EXPLAIN 的使用
- 4.3.2 Seq Scan vs Index Scan
- 4.3.3 成本估算(Cost Estimation)
- 4.3.4 實際執行時間分析(EXPLAIN ANALYZE)
5. 資料庫設計 (Database Design)
5.1 正規化(Normalization)
- 5.1.1 第一正規化(1NF)
- 5.1.2 第二正規化(2NF)
- 5.1.3 第三正規化(3NF)
- 5.1.4 BCNF(Boyce-Codd Normal Form)
- 5.1.5 何時需要反正規化
5.2 關聯設計
- 5.2.1 一對一(One-to-One)
- 5.2.2 一對多(One-to-Many)
- 5.2.3 多對多(Many-to-Many)
- 5.2.4 自我關聯(Self-Referencing)
5.3 約束(Constraints)
- 5.3.1 主鍵(Primary Key)
- 5.3.2 外鍵(Foreign Key)
- 5.3.3 唯一約束(Unique)
- 5.3.4 非空約束(NOT NULL)
- 5.3.5 檢查約束(CHECK)
- 5.3.6 預設值(DEFAULT)
5.4 資料類型選擇
- 5.4.1 整數類型(INT、BIGINT)
- 5.4.2 浮點數與 DECIMAL
- 5.4.3 字串類型(VARCHAR、TEXT)
- 5.4.4 日期時間類型
- 5.4.5 布林類型
- 5.4.6 JSON 類型
6. 高並發場景處理 ⭐
6.1 閃購/秒殺系統
6.1.1 閃購的挑戰
- 高並發讀寫
- 超賣問題
- 系統崩潰風險
6.1.2 解決方案
- Redis 預扣庫存
- 消息隊列削峰
- 分層驗證
- 限流與熔斷
6.1.3 完整架構設計
- CDN 靜態資源
- Redis 快取層
- 消息隊列
- 資料庫層
- 異步處理
6.1.4 實戰案例分析
6.2 庫存系統設計
- 6.2.1 庫存扣減策略
- 6.2.2 預留庫存機制
- 6.2.3 庫存回補
- 6.2.4 分散式庫存
6.3 訂單系統設計
- 6.3.1 訂單狀態機
- 6.3.2 訂單超時處理
- 6.3.3 訂單取消與退款
- 6.3.4 分散式交易
7. 效能調校 (Performance Tuning)
7.1 資料庫層級優化
- 7.1.1 連接池設置
- 7.1.2 緩衝區配置
- 7.1.3 查詢快取
- 7.1.4 慢查詢日誌分析
- 7.1.5 資料庫參數調整
7.2 應用層級優化
- 7.2.1 連接管理
- 7.2.2 批次操作
- 7.2.3 預處理語句(Prepared Statements)
- 7.2.4 ORM 效能陷阱
- 7.2.5 N+1 查詢問題
7.3 快取策略
7.3.1 快取更新策略
- Cache-Aside
- Read-Through
- Write-Through
- Write-Behind
7.3.2 快取一致性問題
7.3.3 快取穿透、擊穿、雪崩
7.3.4 Redis 快取實戰
8. 資料庫擴展 (Scaling)
8.1 垂直擴展(Scale Up)
- 8.1.1 硬體升級
- 8.1.2 限制與成本
8.2 水平擴展(Scale Out)
8.2.1 讀寫分離
- 主從複製(Master-Slave)
- 複製延遲問題
- 讀寫分離策略
8.2.2 分庫分表(Sharding)
- 垂直分庫
- 水平分表
- 分片鍵選擇
- 跨分片查詢
- 分散式 ID 生成
8.2.3 分散式資料庫
- CAP 定理
- BASE 理論
- 最終一致性
9. 備份與恢復 (Backup & Recovery)
9.1 備份策略
- 9.1.1 完整備份(Full Backup)
- 9.1.2 增量備份(Incremental Backup)
- 9.1.3 差異備份(Differential Backup)
- 9.1.4 邏輯備份 vs 物理備份
- 9.1.5 備份頻率與保留策略
9.2 災難恢復
- 9.2.1 Point-in-Time Recovery(PITR)
- 9.2.2 高可用性架構
- 9.2.3 故障轉移(Failover)
- 9.2.4 資料中心容災
10. 安全性 (Security)
10.1 訪問控制
- 10.1.1 用戶與角色管理
- 10.1.2 權限管理(GRANT、REVOKE)
- 10.1.3 最小權限原則
10.2 SQL 注入防護
- 10.2.1 什麼是 SQL 注入
- 10.2.2 參數化查詢
- 10.2.3 ORM 的安全使用
- 10.2.4 輸入驗證
10.3 資料加密
- 10.3.1 傳輸加密(SSL/TLS)
- 10.3.2 靜態資料加密
- 10.3.3 敏感資料處理
11. NoSQL 資料庫
11.1 Redis
- 11.1.1 資料結構(String、Hash、List、Set、ZSet)
- 11.1.2 持久化(RDB、AOF)
- 11.1.3 快取應用
- 11.1.4 分散式鎖
- 11.1.5 發布訂閱
11.2 MongoDB
- 11.2.1 文件導向資料庫
- 11.2.2 查詢語言
- 11.2.3 索引策略
- 11.2.4 聚合框架
- 11.2.5 複製與分片
11.3 Elasticsearch
- 11.3.1 全文搜尋
- 11.3.2 倒排索引
- 11.3.3 分詞與分析
- 11.3.4 聚合查詢
12. 實戰專案案例
12.1 電商系統
- 12.1.1 商品系統資料庫設計
- 12.1.2 訂單系統資料庫設計
- 12.1.3 用戶系統資料庫設計
- 12.1.4 庫存系統資料庫設計
- 12.1.5 支付系統資料庫設計
12.2 社交媒體
- 12.2.1 用戶關係設計
- 12.2.2 動態消息流設計
- 12.2.3 評論系統設計
- 12.2.4 通知系統設計
12.3 內容管理系統
- 12.3.1 文章管理
- 12.3.2 分類與標籤
- 12.3.3 版本控制
- 12.3.4 權限系統
12.4 金融系統
- 12.4.1 帳戶系統
- 12.4.2 交易記錄
- 12.4.3 對帳系統
- 12.4.4 風控系統
13. 監控與維運 (Monitoring & Operations)
13.1 效能監控
- 13.1.1 QPS/TPS 監控
- 13.1.2 慢查詢監控
- 13.1.3 連接數監控
- 13.1.4 鎖等待監控
- 13.1.5 磁碟 I/O 監控
13.2 日誌管理
- 13.2.1 錯誤日誌
- 13.2.2 慢查詢日誌
- 13.2.3 二進制日誌
- 13.2.4 審計日誌
13.3 告警系統
- 13.3.1 告警指標設置
- 13.3.2 告警通知
- 13.3.3 故障處理流程
14. 進階主題
14.1 MVCC 原理深入
- 14.1.1 多版本並發控制機制
- 14.1.2 PostgreSQL 的實作
- 14.1.3 MySQL 的實作
- 14.1.4 版本鏈與可見性判斷
14.2 查詢優化器
- 14.2.1 基於成本的優化(CBO)
- 14.2.2 基於規則的優化(RBO)
- 14.2.3 統計資訊收集
- 14.2.4 執行計劃選擇
14.3 儲存引擎
- 14.3.1 InnoDB 引擎
- 14.3.2 MyISAM 引擎
- 14.3.3 記憶體引擎
- 14.3.4 列式儲存
14.4 分散式系統
14.4.1 分散式交易
- 兩階段提交(2PC)
- 三階段提交(3PC)
- TCC(Try-Confirm-Cancel)
- Saga 模式
14.4.2 分散式鎖
14.4.3 分散式 ID
14.4.4 分散式一致性
📝 學習建議
優先級順序
🔥 必須掌握(核心概念)
- 交易與隔離層級(第 2 章)
- 索引原理與應用(第 3 章)
- 鎖機制(悲觀鎖、樂觀鎖)
- 查詢優化基礎(第 4 章)
- 資料庫設計基礎(第 5 章)
⭐ 重要掌握(進階應用)
- 高並發場景處理(第 6 章)
- 效能調校(第 7 章)
- 資料庫擴展(第 8 章)
- NoSQL 基礎(第 11 章)
💡 建議了解(深入研究)
- MVCC 原理(第 14.1)
- 分散式系統(第 14.4)
- 監控與維運(第 13 章)
學習路徑
第一階段(1-2 週):基礎打底
→ 第 1 章:資料庫基礎概念
→ 第 2 章:交易與隔離層級
→ 第 3 章:索引基礎
第二階段(2-3 週):進階應用
→ 第 4 章:查詢優化
→ 第 5 章:資料庫設計
→ 第 6 章:高並發處理
第三階段(2-3 週):實戰演練
→ 第 7 章:效能調校
→ 第 12 章:實戰案例
→ 實際專案應用
第四階段(持續學習):深入研究
→ 第 8 章:資料庫擴展
→ 第 14 章:進階主題
→ 閱讀資料庫原始碼🔖 快速參考
常用指令速查
- PostgreSQL 常用指令
- MySQL 常用指令
- Redis 常用指令
- MongoDB 常用指令
最佳實踐清單
- 索引設計檢查清單
- 查詢優化檢查清單
- 資料庫安全檢查清單
- 效能調校檢查清單
面試重點
- 高頻面試題整理
- 系統設計題目
- 實戰場景題
📚 推薦資源
書籍
- 《高性能 MySQL》
- 《PostgreSQL 修煉之道》
- 《數據密集型應用系統設計》(DDIA)
- 《Redis 設計與實現》
線上資源
- PostgreSQL 官方文件
- MySQL 官方文件
- Redis 官方文件
- Use The Index, Luke(索引教學網站)
實作練習
- LeetCode Database 題目
- SQL Zoo
- PostgreSQL Exercises
- 自己的專案實作
✅ 學習追蹤
使用 - [ ] 標記每個主題的學習狀態:
- [ ]未開始- [~]學習中- [x]已完成- [!]需要複習
建議為每個主題建立獨立的筆記檔案,並在此目錄中連結。
最後更新: 2025-10-31 版本: v1.0