InnoDB記憶體優化

2021-10-06 21:02:08 字數 3468 閱讀 4222

1、innodb_buffer_pool_size

​ innodb_buffer_pool_size 的值越大,快取命中率越高,訪問 innodb 表需要的磁碟 i/o 就越少,效能也就越高。在乙個專用的資料庫伺服器上可以將 80% 的物理記憶體分配給 innodb buffer pool ,需要注意避免設定過大而導致頁的交換。

#檢視 buffer pool 的使用情況 

show global status like '%innodb_buffer_pool%';

#計算 innodb 快取池的命中率,如果命中率太低,則應該考慮擴充記憶體、增加 innodb_buffer_pool_size 的值

(1-innodb_buffer_pool_reads/innodb_buffer_pool_read_requests)*100

​ 參考設定

1)物理記憶體小於 1 gb

innodb_buffer_pool_size=128m

innodb_log_file_size=48m

2)物理記憶體為 1 gb ~ 4gb

innodb_buffer_pool_size=物理記憶體*0.5

innodb_log_file_size=128m

3)物理記憶體大於 4 gb

innodb_buffer_pool_size=物理記憶體*0.75

innodb_log_file_size=1024m

2、innodb_old_blocks_pct

​ innodb_old_blocks_pct (old sublist 的比例),可以根據 innodb monitor的輸出資訊來調整 innodb_old_blocks_pct 的值。如果 youngs/s 的值很低,可能需要適當增大 innodb_old_blocks_pct 的值或減少 innodb_old_blocks_time 的值。

mysql> show engine innodb status\g;

...pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

...

3、innodb_old_blocks_time

​ 乙個快取資料塊被插入到 midpoint(old sublist)後,至少要在 old sublist 停留超過 innodb_old_blocks_time(ms)後,才有可能被轉移到 young sublist .

​ 可以根據 innodb monitor的輸出資訊來調整 innodb_old_blocks_time 的值。在進行表掃瞄時,如果 non-youngs/s 很低,youngs/s 很高,就應該考慮將 innodb_old_blocks_time 適當調大,以防止表掃瞄將真正的熱資料淘汰。

mysql> show engine innodb status\g;

...pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

...

4、innodb_buffer_pool_instances

​ 適當增加此引數的值,可以降低併發導致的內部快取訪問衝突,改善效能。 innodb 快取系統會將 innodb_buffer_pool_size 的大小平分為 innodb_buffer_pool_instances 個 buffer pool。

5、innodb_max_dirty_pages_pct

​ 1) 控制緩衝池中髒頁的最大比例,如果髒頁達到或超過該值, innodb 後台執行緒將開始快取重新整理。

​ 2) 若 innodb_buffer_pool_wait_free 的值增長較快,則說明 innodb 經常在等待空閒快取頁,如果無法增大快取池,那麼應將 innodb_max_dirty_pages_pct的值調小或將 innodb_io_capacity 的值提高,以加快髒頁的重新整理。

6、innodb_io_capacity

​ 1) 代表磁碟系統的 i/o 能力,對於轉速較低的磁碟; 如 7200rpm 的磁碟,可將 innodb_io_capacity 的值降低到 100 ;而對於固態硬碟和由多個磁碟組成的盤陣, innodb_io_capacity 的值可以適當增大。對於固態硬碟來說,建議設定為 2000 或者更高。

​ 2) innodb_io_capacity 決定一批重新整理髒頁的數量,當快取池髒頁的比例達到 innodb_max_dirty_pages_pct 時, innodb 大約將 innodb_io_capacity 個已改變的快取頁重新整理到磁碟。

​ 3) 當髒頁小於 innodb_max_dirty_pages_pct 時,如果 innodb_adaptive_flushing=on , innodb 將根據函式 buf_flush_get_desired_flush_rate 返回的重做日誌產生的速度來確定要重新整理的髒頁數。

​ 4) 在合併插入快取時,innodb 每次合併的頁數是 0.05*innodb_io_capacity

​ 5) 若 innodb_buffer_pool_wait_free 的值增長較快,則說明 innodb 經常在等待空閒快取頁,如果無法增大快取池,那麼應將 innodb_max_dirty_pages_pct的值調小或將 innodb_io_capacity 的值提高,以加快髒頁的重新整理。

7、innodb_doublewrite

​ 對於要求超高效能,有能容忍極端情況下少量資料丟失的應用,可以通過在配置檔案中增加 innodb_doublewrite=0 引數設定來關閉 innodb_doublewrite,以盡量滿足效能方面的要求

8、join_buffer_size & sort_buffer_size

​ 如果 sort_merge_passes 的值很大,可以考慮調整引數 sort_buffer_size 的值來增大排序快取區,以改善帶有 order by 子句或 group 子句 sql 的效能。

mysql> show global status like 'sort_merge_passes';

+-------------------+-------+

| variable_name | value |

+-------------------+-------+

| sort_merge_passes | 0 |

+-------------------+-------+

1 row in set (0.00 sec)

​ 注意:join_buffer_size 和 sort_buffer_size 都是面向客戶服務執行緒分配的,如果設定過大造成記憶體浪費,甚至導致記憶體交換。尤其是 join_buffer_size ,如果是多表關聯的複雜查詢,還可能會分配多個 join buffer ,因此最好是設定較小的全域性 join_buffer_size ,而對需要做複雜連線操作的 session 單獨設定較大的 join_buffer_size。

INNODB記憶體結構

innodb記憶體結構如下圖 innodb高速緩衝對innodb很重要 innodb不依賴os,而自己快取了所有資料,包括索引資料,行資料,等等,這點跟myisam有差別 myisam的資料依靠os的pagecache進行快取 應該把它設定大一些,建議設定為可用ram的50 80 查詢或更新需要對i...

innodb分配記憶體

innodb分配記憶體有三種方法 1 使用os的malloc 2 使用innodb自己實現的記憶體分配方法 3 使用goolge的tmalloc 在my.cn配置檔案中可設定 innodb是使用自帶的記憶體分配程式,還是使用當前部署的作業系統中現有的更高效的記憶體分配程式 預設設定值為1,設定為0 ...

走近InnoDB記憶體結構

log buffer adaptive hash index 參考我們先來看看mysql官方給出的innodb的整體結構,如下圖,從圖中可以看出,大致可以分為左右兩個部分,左邊描述的是記憶體結構,就是本文討論的主要內容,右邊描述的是磁碟結構,會在之後的文章裡講述。從上圖可以看出,內容結構又可以細分為...