MySQL / PostgreSQL 都有一個惱人的問題 - Double Buffering。

MySQL / PostgreSQL 需要控制自己的 Buffer 也需要用到 Buffer I/O,這會導致一個明顯的問題:資料庫的某些資料會佔用兩份記憶體。這減低記憶體的利用率,也降低效能。

在 MySQL 是 InnoDB Buffer Pool 及 OS Cache;PostgreSQL 是 Shared Buffer 及 OS Cache。前者是資料庫自帶的 Buffer,後者是作業系統的 Page Cache。

所幸 MySQL 支援 O_DIRECT,開啟文件時,讀 / 寫操作可以繞過 OS Cache,直接在 Device (Disk) 上讀 / 寫,避免 Double Buffering 的開銷。也因為有效降低 OS Cache 的利用,記憶體利用率得以提升,innodb_buffer_pool_size 的設定更可視情況為總記憶體量的 70~80%。

而 PostgreSQL 不支援 O_DIRECT,無法繞過 OS Cache,因此 Shared Buffer 不會超過總記憶體的 50%,否則 SWAP 將常發生,嚴重影響效能。不過 PostgreSQL 因存在另個問題,所以 Shared Buffer 建議最大也不超過 8 GB。