Mysql

當我的 Mysql 實例的索引大小超過 innodb_buffer_pool_size 時會發生什麼?

  • December 20, 2013

我正在使用亞馬遜的 RDS db.m1.small。

innodb_buffer_pool_size 設置為 1125.00 MB。

目前索引大小為 1110.00 MB,並且增長緩慢但穩定。

我不需要更多的硬碟空間。

我想知道是否有必要升級到更大的實例 (db.m1.medium) 以保持我的應用程序順利執行。索引適合記憶體是否重要?我的下一步應該是什麼?

這不是索引大小……它是數據索引。InnoDB 緩衝池:

…保存表和索引的記憶體 InnoDB 數據

http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_buffer_pool

緩衝池越大,InnoDB 越像記憶體數據庫,從磁碟讀取一次數據,然後在後續讀取期間從記憶體中訪問數據。緩衝池甚至記憶體插入和更新操作更改的數據,以便可以將磁碟寫入分組在一起以獲得更好的性能。

http://dev.mysql.com/doc/refman/5.6/en/innodb-buffer-pool.html

相反,緩衝池越小,InnoDB 的作用就越少,就像記憶體數據庫一樣。

在理想的世界中,您的緩衝池大於數據大小加上索引大小加上一點點成本,因為 InnoDB 在不將該頁面儲存在緩衝池中的情況下對錶空間中的頁面不做任何事情,因此當池已滿時,最近較少使用的東西被從池中逐出。當然,實用性通常需要比理想更小的東西,而適當調整大小的關鍵是工作數據集。您在伺服器上擁有的不經常訪問的數據越多,您應該期望從一個過小的池中出現的潛在性能問題就越少。

當然,這沒有公式…熟悉您獨特的工作數據集是您可以使用的唯一“工具”…但SHOW STATUS LIKE '%buffer%';會給您計數器。

注意Innodb_buffer_pool_pages_free僅表示池中完全未使用的空間…如果此值非常低或為 0,則這不是緊急情況,甚至不是非常有意義,因為即使頁面舊且沒有程序自發地從池中逐出頁面並且空閒…但是只要它們不是“臟”的,那麼用其他內容替換一個頁面在成本上與將頁面載入到可用空間中基本上沒有區別。零空閒僅表示在伺服器啟動後的某個時間點,讀入池的總數據和索引超過了池的大小,並且自上次峰值以來沒有足夠的刪除或刪除表來釋放任何頁面。另請注意,執行備份往往會填滿一個較小的池,相對無害,具體取決於先前工作負載載入到池中的內容。

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