Mysql

MySQL 如何使用 InnoDB Buffer?

  • July 20, 2018

例如,使用時mysqltuner.pl,它告訴我將 InnoDB 緩衝區大小增加到 > 5GB,因為我的數據是 5.6GB

這是否意味著:如果我為 InnoDB Buffer 分配了足夠的空間,數據將從記憶體而不是磁碟載入,並且會大大提高我的數據庫的 QPS?

簡短答案:經驗法則:如果您的 RAM 超過 4GB,則設置innodb_buffer_pool_size可用RAM 的 70% 左右。設置並忘記。

長答案

“大大提高QPS?” - 這取決於。

buffer_pool 是一個“記憶體”,大致維護為“最近最少使用”。

如果您的數據 + 索引大於 buffer_pool,則可能會有所放緩。要麼適應速度,要麼獲得更多 RAM。

我已經看到 TB 數據集在 32GB 的伺服器上執行良好。這取決於“工作集”。如果應用程序只翻閱部分行(例如,“最近的”行),那麼小的 buffer_pool 和大的一樣好用。

如果你有 UUID,你就會被淹沒。這些會導致隨機訪問,導致 IO 與購買更多 RAM 相比變慢。

mysqltuner 有一些優點和一些缺點。除非您有 8GB 或更多的 RAM,否則不要將您的 buffer_pool 增加到“足夠大”。與縮小 buffer_pool 相比,交換對性能的影響要差得多*。*

使用足夠大的 buffer_pool,它不會自動載入所有內容。作為“記憶體”,事物(16KB 塊)會根據需要載入,然後留在那裡。如果它不夠大並且您的“工作集大小”很大,那麼這些塊將被撞出以為其他塊騰出空間。自動地。唯一的代價是速度。

老實說,為 innodb_buffer_pool_size 分配 5GB 可能無法容納 5GB。為什麼不 ???請看一下 Vadim Tkachenko 的下圖

InnoDB

查看左上角。緩衝池有一個專門用於插入緩衝區(專用於保存二級索引更改的記憶體結構)的部分。

如果您嘗試將所有 InnoDB 數據和索引頁面載入到 RAM 中,那麼在您開始更改作為輔助(非唯一)索引一部分的列的那一刻,16K 頁面將開始被踢出緩衝池以騰出空間變化。

數據庫的寫入密集度越高,需要在緩衝池中記錄的插入緩衝區更改就越多。

如果您查看標題“插入 buffer_pool 的緩衝區部分”下的黃色框,第一行顯示“InnoDB-std:可能佔用 buffer_pool 的 1/2”。

這意味著具有 5GB 的寫入量最大的應用程序將需要 10GB 緩衝池。聽起來很可笑,但情況可能就是這樣。

就個人而言,我會讓緩衝池 7GB 開始。我還要確保我已經配置了這些my.cnf

[mysqld]
innodb_buffer_pool_load_at_startup
innodb_buffer_pool_dump_at_shutdown
innodb_read_io_threads = 8

這樣,mysqld 的任何重新啟動都會保留緩衝池的內容並重新載入它(不會是瞬時的,但會在幾分鐘內載入)

我將讀取 I/O 執行緒的數量增加了一倍,以提高數據讀入緩衝池的速度。

引用自:https://dba.stackexchange.com/questions/212086