[英]Figuring out right value for innodb_buffer_pool_size in MySQL 5.7+
我試圖了解如何評估MySQL中innodb_buffer_pool_size值的任何改進范圍,而與所使用的硬件無關。 我遇到了社區中建議的兩種最常見的方法: 從當前數據> =〜5-10%的值+ index_data大小b開始。 將其設置為總可用RAM的〜75-80%。
我不確定應該根據哪些方向決定采取這些指示?
我瀏覽了以下文章: 設置為75%的RAM ,其中說使用查詢1來查找總數據大小,如果超出可用的RAM大小,則分配該大小的75%。 另一方面, 本文說使用下面的查詢2來適應額外的5%的增長並分配該值。
這些值有何不同? 查詢1是否僅考慮了緩沖池中的當前數據大小,而查詢2是整個數據庫(數據+索引)的大小?我也不遵循查詢中引入的“ 1.1”是什么2。
查詢1:
SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;
查詢2:
SELECT CONCAT(CEILING(RIBPS/POWER(1024,pw)),SUBSTR(' KMGT',pw+1,1))
Recommended_InnoDB_Buffer_Pool_Size FROM
(
SELECT RIBPS,FLOOR(LOG(RIBPS)/LOG(1024)) pw
FROM
(
SELECT SUM(data_length+index_length)*1.1*growth RIBPS
FROM information_schema.tables AAA,
(SELECT 1.05 growth group by growth) BBB
WHERE ENGINE='InnoDB'
) AA
) A;
buffer_pool從兩個方向拉:
更多:緩沖池越大,可以緩存的緩存越多,因此處理速度更快。 但是,如果它太大而導致交換,那么,這對於性能來說是可怕的。 結論:“更多,但不要太多”。
更少:如果只有很少的數據集,為什么要浪費RAM? 但是數據集可能會增長,那么為什么還要設置為“ small”呢? MySQL不會因為buffer_pool大於數據集而受到損害,因此SELECT
大多是在浪費時間。
讓我們看一下需要什么RAM:
很難確切地說出它們的總和,因此缺少精確的公式。
因此,如果您假設計算機上沒有其他應用程序,則可以提出一個簡單的公式。
計划A:假設1GB用於“其他內容”,然后將剩余的80%留給緩沖池。 但是,如果您只有1GB的RAM,那么這將分崩離析。
方案B:只需說一下RAM的70%。 這樣效果更好,但是如果您的RAM不足4GB,則給出的數字太大,而對於較大的計算機,數字太小。
方案C:“ 75-80%”。 這適用於大型計算機。
計划D:如前所述,計算您擁有的數據量。 但這只是一個“下界”。 但是,如果這導致交換,那就不好了。 因此,如果沒有列出一些注意事項,這將毫無用處。
注意:所有這些討論都適用於包含InnoDB的所有版本,該版本可以追溯到4.0。
同時,如果除了系統表之外不使用MyISAM,請設置key_buffer_size = 40M
。 需要一些空間,但不多。
如果你同時使用MyISAM和InnoDB(或只是MyISAM數據),見http://mysql.rjweb.org/doc.php/memory
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.