舊版本放哪裡,決定了誰會膨脹
兩套資料庫都要保留資料的舊版本(MVCC 的代價),差別在把舊版本放在哪裡——而這個位置決定了「打掃房間」會不會打擾到主表。
| 舊版本放哪 | 清理機制 | 後果 | |
|---|---|---|---|
| PostgreSQL | 留在主表裡(更新=生成新資料、保留舊資料) | 背景程序 AutoVacuum | 產生大量死 Tuple;配置不當或寫入太快 → 表迅速 Bloat(膨脹) → 吃光磁碟、查詢變慢 |
| MySQL | 獨立區域 Undo Log | Purge | Undo Log 也要清,但不會直接導致主表結構快速膨脹,主表空間通常比較緊湊 |
這其實是一筆運維成本
這條差異不是效能數字,是要不要養一門手藝:
用 PG 就得會 Vacuum 調優、監控表膨脹;不想處理這些,MySQL 的帳單比較小。
這和 PG 的寫入放大來自位置過期,不是欄位變動 是同一個機制的前後段:寫入放大是當下的 I/O,膨脹是之後的帳單。
和 jsonb 那篇的關係
jsonb 能比資料模型,不能比擴展架構 已經寫過「改 jsonb 裡一個小欄位 → 整份文件重寫 → bloat 與 vacuum 壓力」。要注意那不是 jsonb 的特性,是 PG MVCC 的通性——任何常被 UPDATE 的表都會中,jsonb 只是把每次重寫的量放大。