結論先講

怎麼寫比用什麼 DB 影響更大。 Bulk Insert vs 逐筆寫入差 26 倍,Connection Pool 調整差 70%,加 Redis Cache 差 650%——這些都是「寫法」和「配置」的差異。相比之下,PG vs MySQL 的差距在大部分場景只有 2-3 倍,而且各有強項互有勝負。你應該先把查詢寫對、配置調好,最後才考慮換資料庫。


數據總整理

PG vs MySQL:各有勝負

場景贏家差距篇章
JSON 查詢(JSONB)PostgreSQL3.2 倍[[micro-service/17-db-pg-vs-mysql|#17]]
寫入密集MySQL2.5 倍[[micro-service/17-db-pg-vs-mysql|#17]]
全文搜尋PostgreSQLpg_trgm 開箱即用[[micro-service/17-db-pg-vs-mysql|#17]]
簡單讀取持平< 10%[[micro-service/17-db-pg-vs-mysql|#17]]

結論:PG 是通用首選(JSON + 搜尋 + 擴充功能),MySQL 在純寫入密集場景有優勢。大部分專案用 PG 就對了。

查詢方式的影響(比選 DB 更大)

優化效果成本篇章
Bulk Insert vs 逐筆+2600%(26 倍)改幾行 code[[micro-service/18-db-bulk-and-index|#18]]
加 Index+300~500%加 migration[[micro-service/18-db-bulk-and-index|#18]]
Connection Pool 5→50+70%改一行配置[[micro-service/19-db-pool-and-infra|#19]]
ORM vs Raw SQL< 10%[[micro-service/18-db-bulk-and-index|#18]]

注意 ORM vs Raw SQL 那一行:差距不到 10%。這表示用 ORM 不會讓你的系統變慢。效能問題幾乎都出在「沒加 index」「沒用 bulk」「pool 太小」,不是出在 ORM 本身。

進階儲存方案

方案效果適用場景篇章
MongoDB 讀取PG JSONB 只差 4%非結構化文件[[micro-service/19-db-pool-and-infra|#31]]
MongoDB 寫入比 PG 快 8.6 倍高速 log / IoT[[micro-service/19-db-pool-and-infra|#31]]
Redis Cache(讀多)+650%讀寫比 > 10:1[[micro-service/32-pg-migration-guide|#32]]
讀寫分離+30%讀寫比 > 5:1[[micro-service/61-db-read-write-splitting|#61]]

Redis +650% vs 讀寫分離 +30%——這個對比說明了一切。很多人一聽到「DB 太慢」就想做讀寫分離,但加 Redis cache 的效果是它的 20 倍,而且實作更簡單。


優化優先順序(這是這篇最重要的部分)

優先順序 1:Connection Pool 調整     → +70%(改一行配置,5 分鐘搞定)
    ↓
優先順序 2:加 Index                 → +300~500%(跑個 migration)
    ↓
優先順序 3:Bulk Insert              → +2600%(改幾行程式碼)
    ↓
優先順序 4:Redis Cache              → +650%(加 Redis 服務 + 幾行 code)
    ↓
優先順序 5:讀寫分離                 → +30%(最後才做!)

為什麼讀寫分離排最後?

  1. 效果最小:+30% 在所有方案中排最末
  2. 成本最高:需要 Replica、路由邏輯、資料一致性處理
  3. 有副作用:Replica lag 導致「剛寫入的資料讀不到」問題
  4. 前提條件:前四項都做完後才可能需要它

讀寫分離不是壞方案,它只是 ROI 最低的方案。在 [[micro-service/61-db-read-write-splitting|#61]] 中我們實測了它的效果——確實有用,但你得確定前面四個更便宜的方案都已經做完了。


選型建議

什麼時候用 PG

  • 大部分情況——它是通用最佳選擇
  • 需要 JSONB 半結構化查詢
  • 需要 pg_trgm 全文搜尋(不想裝 ES)
  • 需要地理空間查詢(PostGIS)
  • 資料完整性要求高(金融、醫療)

什麼時候用 MySQL

  • 團隊已經很熟 MySQL 生態
  • 寫入密集場景(IoT 資料收集、高頻 log)
  • 已有大量 MySQL 遷移成本太高

什麼時候加 MongoDB

  • 文件結構頻繁變動、沒有固定 schema
  • 寫入量極大且不需要事務(8.6 倍寫入優勢)
  • 不要用來取代 PG——JSONB 讀取只差 4%,PG 同時有關聯式查詢能力

什麼時候加 Redis

  • 讀寫比超過 10:1
  • 有明確的熱資料(首頁、排行榜、session)
  • 需要計數器、rate limiting、分散式鎖

回到數據

所有結論基於以下壓測:

  • [[micro-service/17-db-pg-vs-mysql|#17 PG vs MySQL]]——兩大 RDBMS 正面對決
  • [[micro-service/18-db-bulk-and-index|#18 Bulk Insert 與 Index]]——查詢方式的巨大影響
  • [[micro-service/19-db-pool-and-infra|#19 Connection Pool]]——最容易被忽略的配置
  • [[micro-service/19-db-pool-and-infra|#31 MongoDB Benchmark]]——NoSQL 的定位
  • [[micro-service/32-pg-migration-guide|#32 PG 遷移指南]]——從其他 DB 搬過來
  • [[micro-service/61-db-read-write-splitting|#61 讀寫分離]]——最後的手段

調好配置和查詢方式之後,大部分系統根本不需要換資料庫。



下一篇

Storage 結論:什麼時候加什麼儲存服務 — DB 選好了,接下來看什麼時候需要加 Redis、ES、Kafka。

本系列文章

完整 68 篇目錄見 系列首頁

← 上一篇:B2E 結論:後端框架最終推薦與場景對照 → 下一篇:Storage 結論:什麼時候加什麼儲存服務