1. 程式人生 > 其它 >Mysql優化之innodb_buffer_pool_size篇

Mysql優化之innodb_buffer_pool_size篇

前段時間,公司領導反映服務瞬時查詢緩慢,壓力比較大,針對這點,進行了一些瞭解與分析

1. 為什麼需要innodb buffer pool?

在MySQL5.5之前,廣泛使用的和預設的儲存引擎是MyISAM。MyISAM使用作業系統快取來快取資料。InnoDB需要innodb buffer pool中處理快取。所以非常需要有足夠的InnoDB buffer pool空間。

2. MySQL InnoDB buffer pool 裡包含什麼?

  • 資料快取
    InnoDB資料頁面

  • 索引快取
    索引資料

  • 緩衝資料
    髒頁(在記憶體中修改尚未重新整理(寫入)到磁碟的資料)

  • 內部結構
    如自適應雜湊索引,行鎖等。

3. 如何設定innodb_buffer_pool_size?

innodb_buffer_pool_size預設大小為128M。最大值取決於CPU的架構。在32-bit平臺上,最大值為2**32 -1,在64-bit平臺上最大值為2**64-1。當緩衝池大小大於1G時,將innodb_buffer_pool_instances設定大於1的值可以提高伺服器的可擴充套件性。

大的緩衝池可以減小多次磁碟I/O訪問相同的表資料。在專用資料庫伺服器上,可以將緩衝池大小設定為伺服器實體記憶體的80%。

3.1 配置緩衝池大小時,請注意以下潛在問題

  • 實體記憶體爭用可能導致作業系統頻繁的paging

  • InnoDB為緩衝區和control structures保留了額外的記憶體,因此總分配空間比指定的緩衝池大小大約大10%。

  • 緩衝池的地址空間必須是連續的,這在帶有在特定地址載入的DLL的Windows系統上可能是一個問題。

  • 初始化緩衝池的時間大致與其大小成比例。在具有大緩衝池的例項上,初始化時間可能很長。要減少初始化時間,可以在伺服器關閉時儲存緩衝池狀態,並在伺服器啟動時將其還原。

    • innodb_buffer_pool_dump_pct:指定每個緩衝池最近使用的頁面讀取和轉儲的百分比。 範圍是1到100。預設值是25。例如,如果有4個緩衝池,每個緩衝池有100個page,並且innodb_buffer_pool_dump_pct設定為25,則dump每個緩衝池中最近使用的25個page。
    • innodb_buffer_pool_dump_at_shutdown:預設啟用。指定在MySQL伺服器關閉時是否記錄在InnoDB緩衝池中快取的頁面,以便在下次重新啟動時縮短預熱過程。
    • innodb_buffer_pool_load_at_startup:預設啟用。指定在MySQL伺服器啟動時,InnoDB緩衝池通過載入之前儲存的相同頁面自動預熱。 通常與innodb_buffer_pool_dump_at_shutdown結合使用。

增大或減小緩衝池大小時,將以chunk的形式執行操作。chunk大小由innodb_buffer_pool_chunk_size配置選項定義,預設值為128 MB。

緩衝池大小必須始終等於或者是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數。
如果將緩衝池大小更改為不等於或等於innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數的值,
則緩衝池大小將自動調整為等於或者是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數的值。

innodb_buffer_pool_size可以動態設定,允許在不重新啟動伺服器的情況下調整緩衝池的大小。 可以通過狀態變數Innodb_buffer_pool_resize_status報告線上調整緩衝池大小操作的狀態。

執行語句

 show status like 'Innodb_buffer_pool_resize%';

3.2 配置示例

在以下示例中,innodb_buffer_pool_size設定為1G,innodb_buffer_pool_instances設定為1。innodb_buffer_pool_chunk_size預設值為128M。

1G是有效的innodb_buffer_pool_size值,因為1G是innodb_buffer_pool_instances = 1 * innodb_buffer_pool_chunk_size = 128M的倍數

執行語句

show variables like 'innodb_buffer_pool%';
innodb_buffer_pool_size=(1024*1024)/innodb_buffer_pool_chunk_size/innodb_buffer_pool_instances

3.3 線上調整InnoDB緩衝池大小

SET GLOBAL innodb_buffer_pool_size = 3221225472

3.4 監控線上緩衝池調整進度

SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';

4. 配置的innodb_buffer_pool_size是否合適?

當前配置的innodb_buffer_pool_size是否合適,可以通過分析InnoDB緩衝池的效能來驗證。

可以使用以下公式計算InnoDB緩衝池效能:

Performance = innodb_buffer_pool_reads / innodb_buffer_pool_read_requests * 100

innodb_buffer_pool_reads:表示InnoDB緩衝池無法滿足的請求數。需要從磁碟中讀取。

innodb_buffer_pool_read_requests:表示從記憶體中讀取邏輯的請求數。

例如,在我的伺服器上,檢查當前InnoDB緩衝池的效能

show status like 'innodb_buffer_pool_read%';

Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests*100 即 1700/940668*100=0.18072263540378

意味著InnoDB可以滿足緩衝池本身的大部分請求。從磁碟完成讀取的百分比非常小。因此無需增加innodb_buffer_pool_size值。

InnoDB buffer pool 命中率:

InnoDB buffer pool 命中率 = innodb_buffer_pool_read_requests / (innodb_buffer_pool_read_requests + innodb_buffer_pool_reads ) * 100

此值低於99%,則可以考慮增加innodb_buffer_pool_size。

5. InnoDB緩衝池狀態變數有哪些?

可以執行以下命令進行檢視:

show global status like '%innodb_buffer_pool_pages%';

說明

  • Innodb_buffer_pool_pages_data
    InnoDB緩衝池中包含資料的頁數。 該數字包括髒頁面和乾淨頁面。 使用壓縮表時,報告的Innodb_buffer_pool_pages_data值可能大於Innodb_buffer_pool_pages_total。
  • Innodb_buffer_pool_pages_dirty
    顯示在記憶體中修改但尚未寫入資料檔案的InnoDB緩衝池資料頁的數量(髒頁重新整理)。

  • Innodb_buffer_pool_pages_flushed
    表示從InnoDB緩衝池中重新整理髒頁的請求數。

  • Innodb_buffer_pool_pages_free
    顯示InnoDB緩衝池中的空閒頁面

  • Innodb_buffer_pool_pages_misc
    InnoDB緩衝池中的頁面數量很多,因為它們已被分配用於管理開銷,例如行鎖或自適應雜湊索引。此值也可以計算為Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free - Innodb_buffer_pool_pages_data

  • Innodb_buffer_pool_pages_total
    InnoDB緩衝池的總大小,以page為單位。

  • innodb_buffer_pool_reads
    表示InnoDB緩衝池無法滿足的請求數。需要從磁碟中讀取。

  • innodb_buffer_pool_read_requests
    它表示從記憶體中邏輯讀取的請求數。

  • innodb_buffer_pool_wait_free
    通常,對InnoDB緩衝池的寫入發生在後臺。 當InnoDB需要讀取或建立頁面並且沒有可用的乾淨頁面時,InnoDB首先重新整理一些髒頁並等待該操作完成。 此計數器計算這些等待的例項。 如果已正確設定innodb_buffer_pool_size,則此值應該很小。如果大於0,則表示InnoDb緩衝池太小。

  • innodb_buffer_pool_write_request
    表示對緩衝池執行的寫入次數。

以此檢查緩衝池,緩衝池配置合理可以適當優化