MySQL 內存參數總結

MySQL 內存參數總結


Mysql內存可以分爲全局共享內存類似ORACLE的系統全局區SGA,線程獨享內存類似ORACLE的進程全局區PGA。


一、線程獨享內存
在MySQL中,線程獨享內存主要用於各客戶端連接線程存儲各種操作的獨享數據,如線程棧信息,分組排序操作,數據讀寫緩衝,結果集暫存等等。


* 線程棧信息使用內存(thread_stack)
主要用來存放每一個線程自身的標識信息,如線程id,線程運行時基本信息等等。
通過 thread_stack 參數來設置爲每一個線程棧分配多大的內存。
Global,No Dynamic,Default 192K(32bit), 256K(32bit),
推薦配置:默認


* 排序使用內存(sort_buffer_size):
MySQL 用此內存區域進行排序操作(filesort),完成客戶端的排序請求。
當我們設置的排序區緩存大小無法滿足排序實際所需內存的時候,MySQL會將數據寫入磁盤文件來完成排序。
Global Session,Dynamic,Default 2M(32bit), 2M(32bit),
推薦配置:8M(內存足夠的情況下),默認(內存緊張的情況)


* Join操作使用內存(join_buffer_size):
應用程序經常會出現一些兩表(或多表)Join的操作需求,MySQL在完成某些Join需求的時候(all/index join),
爲了減少參與Join的“被驅動表”的讀取次數以提高性能,需要使用到Join Buffer來協助完成Join操作。
Global Session,Dynamic,Default 128K 各版本平臺最大值不一樣
推薦配置:8M(內存足夠的情況下),默認(內存緊張的情況)


* 順序讀取數據緩衝區使用內存(read_buffer_size):
這部分內存主要用於當需要順序讀取數據的時候,如無法使用索引的情況下的全表掃描,全索引掃描等。在這種時候,MySQL按照數據的存儲順序依次讀取數據塊,每次讀取的數據塊首先會暫存在read_buffer_size中,
當buffer空間被寫滿或者全部數據讀取結束後,再將buffer中的數據返回給上層調用者,以提高效率。
Global Session,Dynamic,Default 128K
推薦配置:4M/8M


* 隨機讀取數據緩衝區使用內存(read_rnd_buffer_size):
和順序讀取相反,當MySQL進行非順序讀取(隨機讀取)數據塊的時候,會利用這個緩衝區暫存讀取的數據。如根據索引信息讀取表數據,根據排序後的結果集與表進行Join等等。
總的來說,就是當數據塊的讀取需要滿足一定的順序的情況下,MySQL就需要產生隨機讀取,進而使用到read_rnd_buffer_size 參數所設置的內存緩衝區。
Global Session,Dynamic,Default 256K
推薦配置:8M


* 連接信息及返回客戶端前結果集暫存使用內存(net_buffer_lenth):
用來存放客戶端連接線程的連接信息和返回客戶端的結果集。當MySQL開始產生可以返回的結果集,會在通過網絡返回給客戶端請求線程之前,會先暫存在通過net_buffer_lenth所設置的緩衝區中,
等滿足一定大小的時候纔開始向客戶端發送,以提高網絡傳輸效率。大不會超過 max_allowed_packet 參數大小。
Global Session,Dynamic,Default 16K
推薦配置:默認 16K


* 批量插入暫存使用內存(bulk_insert_buffer_size):
當我們使用如 insert … values(…),(…),(…)… 的方式進行批量插入的時候,MySQL會先將提交的數據放如一個緩存空間中,當該緩存空間被寫滿或者提交完所有數據之後,MySQL纔會一次性將該緩存空間中的數據寫入數據庫並清空緩存。
此外,當我們進行LOAD DATA INFILE操作來將文本文件中的數據Load進數據庫的時候,同樣會使用到此緩衝區。
Global Session,Dynamic,Default 8M
推薦配置:默認 8M


* 臨時表使用內存(tmp_table_size):
當我們進行一些特殊操作如需要使用臨時表才能完成的Order By,Group By 等等,MySQL可能需要使用到臨時表。
當另一個系統參數 max_heap_table_size 的大小還小於 tmp_table_size 的時候,MySQL將使用 max_heap_table_size 參數所設置大小作爲最大的內存臨時表大小,而忽略tmp_table_size 所設置的值。
Global Session,Dynamic,Default 16M
推薦配置:64M
目前沒有一個簡便的方式來確定內部臨時表的總容量。可以通過MySQL狀態變量created_tmp_tables和created_tmp_disk_tables來確定創建了臨時表和基於磁盤的臨時表
mysql> show global status like 'create%tables';




二、全局共享內存
全局共享內則主要是MySQL Instance以及底層存儲引擎用來暫存各種全局運算及可共享的暫存信息,如
存儲查詢緩存的 Query Cache,
緩存連接線程的 Thread Cache,
緩存表文件句柄信息的 Table Cache,
緩存二進制日誌的 BinLog Buffer,
緩存MyISAM存儲引擎索引鍵的 Key Buffer
存儲InnoDB數據和索引的 InnoDB Buffer Pool等等。


* MyISAM索引緩存 Key Buffer(key_buffer_size):
MyISAM 索引緩存將MyISAM表的索引信息(.MYI文件)緩存在內存中,以提高其訪問性能。
Global ,Dynamic,Default 8M
推薦配置:默認 8M


* 查詢緩存 Query Cache (query_cache_size):
查詢緩存是MySQL比較獨特的一個緩存區域,用來緩存特定Query的結果集(Result Set)信息,且共享給所有客戶端。
通過對Query語句進行特定的Hash計算之後與結果集對應存放在Query Cache中,以提高完全相同的Query語句的相應速度。
Global Dynamic,Default 0
推薦配置:16M


* 連接線程緩存 Thread Cache(thread_cache_size):
連接線程是MySQL爲了提高創建連接線程的效率,將部分空閒的連接線程保持在一個緩存區以備新進連接請求的時候使用,這尤其對那些使用短連接的應用程序來說可以極大的提高創建連接的效率。
可以通過(Connections - Threads_created) / Connections * 100% 計算出連接線程緩存的命中率。
注意,這裏設置的是可以緩存的連接線程的數目,而不是內存空間的大小。
Global,Dynamic,Default 0
推薦配置:8個
如何確定系統Thread Cache的情況?
mysql> show global status like 'Threads_created';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Threads_created | 506 |
+-----------------+-------+
1 row in set (0.00 sec)


mysql> show global status like 'connections';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| Connections | 16513711 |
+---------------+----------+
1 row in set (0.00 sec)
16513711-506/16513711 * 100% =99.9938%


* 表緩存 Table Cache(table_open_cache):
表緩存區主要用來緩存表文件的文件句柄信息。如果沒有Table Cache,那麼MySQL就不得不頻繁的進行打開關閉文件操作。
Global,Dynamic,Default 400
推薦配置:根據內存配置4G 2048 大於最大Opened_tables
如何確定系統table_open_cache的情況?
mysql> show variables like 'table_open_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| table_open_cache | 512 |
+------------------+-------+
1 row in set (0.00 sec)
mysql> show global status like 'open%_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 512 |
| Opened_tables | 6841 |
+---------------+-------+
其中Open_tables是當前正在打開表的數量,Opened_tables是所有已經打開表的數量。
如果Open_tables的值已經接近table_cache的值,且Opened_tables還在不斷變大,則說明mysql正在將緩存的表釋放以容納新的表,此時可能需要加大table_cache的值。對於大多數情況,比較適合的值:
Open_tables / Opened_tables >= 0.85
Open_tables / table_cache <= 0.95


* 表定義信息緩存 Table definition Cache (table_definition_cache):
表定義信息緩存是從 MySQL5.1.3 版本纔開始引入的一個新的緩存區,用來存放表定義信息。
MySQL 提供了 table_definition_cache 參數給我們設置可以緩存的表的數量。注意,這裏設置的是可以緩存的表定義信息的數目,而不是內存空間的大小。
Global, Dynamic, Default 400
推薦配置:根據內存配置4G 2048 和Table Cache一樣即可


* 二進制日誌緩衝區Binlog Cache( binlog_cache_size):
二進制日誌緩衝區主要用來緩存由於各種數據變更操做所產生的 Binary Log 信息。
Global,Dynamic,Default 32K
推薦配置:2M


* InnoDB 日誌緩衝區 InnoDB Log Buffer (innodb_log_buffer_size):
這是 InnoDB 存儲引擎的事務日誌所使用的緩衝區。
類似於 Binlog Buffer,InnoDB 在寫事務日誌的時候,爲了提高性能,也是先將信息寫入 Innofb Log Buffer 中,當滿足 innodb_flush_log_trx_commit 參數所設置的相應條件(或者日誌緩衝區寫滿)之後,纔會將日誌寫到文件(或者同步到磁盤)中。可以通過 innodb_log_buffer_size 參數設置其可以使用的最大內存空間。
注:innodb_flush_log_trx_commit 參數對 InnoDB Log 的寫入性能有非常關鍵的影響。該參數可以設置爲0,1,2,解釋如下:
0:log buffer中的數據將以每秒一次的頻率寫入到log file中,且同時會進行文件系統到磁盤的同步操作,但是每個事務的commit並不會觸發任何log buffer 到log file的刷新或者文件系統到磁盤的刷新操作;
1:在每次事務提交的時候將log buffer 中的數據都會寫入到log file,同時也會觸發文件系統到磁盤的同步;
2:事務提交會觸發log buffer 到log file的刷新,但並不會觸發磁盤文件系統到磁盤的同步。此外,每秒會有一次文件系統到磁盤同步操作。
此外,MySQL文檔中還提到,這幾種設置中的每秒同步一次的機制,可能並不會完全確保非常準確的每秒就一定會發生同步,還取決於進程調度的問題。實際上,InnoDB 能否真正滿足此參數所設置值代表的意義正常 Recovery 還是受到了不同 OS 下文件系統以及磁盤本身的限制,可能有些時候在並沒有真正完成磁盤同步的情況下也會告訴 mysqld 已經完成了磁盤同步。
Global,Dynamic,Default 8M
推薦配置:8M 默認


* InnoDB 數據和索引緩存 InnoDB Buffer Pool(innodb_buffer_pool_size):
InnoDB Buffer Pool 對 InnoDB 存儲引擎的作用類似於 Key Buffer Cache 對 MyISAM 存儲引擎的影響,主要的不同在於 InnoDB Buffer Pool 不僅僅緩存索引數據,還會緩存表的數據。
可以通過 (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計算得到 InnoDB Buffer Pool 的命中率。
global級別,不可動態變更 Default 128M
設置InnoDB數據和索引內存緩存空間大小
配置方式:配置文件中配置
選擇參數:50 - 80 % RAM


* InnoDB 字典信息緩存 InnoDB Additional Memory Pool(innodb_additional_mem_pool_size):
InnoDB 字典信息緩存主要用來存放 InnoDB 存儲引擎的字典信息以及一些 internal 的共享數據結構信息。
global級別,不可動態變更 Default 8M
設置InnoDB存放數據庫字典信息的Buffer大小
推薦配置:50M


三、查看統計
1.查看各參數內存配置方式
#全局共享內存 9個變量
show variables like 'innodb_buffer_pool_size'; /* InnoDB 數據和索引緩存(InnoDB Buffer Pool) */
show variables like 'innodb_additional_mem_pool_size'; /* InnoDB 字典信息緩存(InnoDB Additional Memory Pool)*/
show variables like 'innodb_log_buffer_size'; /* InnoDB 日誌緩衝區(InnoDB Log Buffer) */
show variables like 'binlog_cache_size'; /* 二進制日誌緩衝區(Binlog Buffer)*/
show variables like 'thread_cache_size'; /* 連接線程緩存(Thread Cache)*/
show variables like 'query_cache_size'; /* 查詢緩存(Query Cache)*/
show variables like 'table_open_cache'; /* 表緩存(Table Cache) */
show variables like 'table_definition_cache'; /* 表定義信息緩存(Table definition Cache) */
show variables like 'key_buffer_size'; /* MyISAM索引緩存(Key Buffer) */
#最大線程數
show variables like 'max_connections';
#線程獨享內存 6個變量
show variables like 'thread_stack'; /* 線線程棧信息使用內存(thread_stack) */
show variables like 'sort_buffer_size'; /* 排序使用內存(sort_buffer_size) */
show variables like 'join_buffer_size'; /* Join操作使用內存(join_buffer_size) */
show variables like 'read_buffer_size'; /* 順序讀取數據緩衝區使用內存(read_buffer_size) */
show variables like 'read_rnd_buffer_size'; /* 隨機讀取數據緩衝區使用內存(read_rnd_buffer_size) */
show variables like 'tmp_table_size'; /* 臨時表使用內存(tmp_table_size) ,我實際計算把tmp_table_size放入全局共享內*/
也可以通過系統變量的方式直接獲取
select @@key_buffer_size;
select @@max_connections


2.mysql內存計算公式
mysql使用的內存 = 全局共享內存+最大線程數×線程獨享內存
mysql used mem=innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+binlog_cache_size+thread_cache_size+query_cache_size+table_open_cache+table_definition_cache+key_buffer_size
+max_connections*(
thread_stack+sort_buffer_size+join_buffer_size+read_buffer_size+read_rnd_buffer_size+tmp_table_size)


SET @kilo_bytes=1024;
SET @mega_bytes=@kilo_bytes*1024;
SET @giga_bytes=@mega_bytes*1024;
SELECT (@@innodb_buffer_pool_size+@@innodb_additional_mem_pool_size+@@innodb_log_buffer_size+@@binlog_cache_size+@@thread_cache_size+@@query_cache_size+@@table_open_cache+@@table_definition_cache+@@key_buffer_size+@@max_connections*(@@thread_stack+@@sort_buffer_size+@@join_buffer_size+@@read_buffer_size+@@read_rnd_buffer_size+@@tmp_table_size))/@giga_bytes AS MAX_MEMORY_GB;


這個理論最大的內存使用量,在5.5版本中tmp_table_size默認是16M,按默認最大連接數151計算,光線程獨享的臨時表佔據的空間都是2416M,我實際計算把tmp_table_size放入全局共享內
我的計算公式
mysql使用的內存 = 全局共享內存+最大線程數×線程獨享內存
mysql used mem=innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+binlog_cache_size+thread_cache_size+query_cache_size+table_open_cache+table_definition_cache+key_buffer_size+tmp_table_size
+max_connections*(
thread_stack+sort_buffer_size+join_buffer_size+read_buffer_size+read_rnd_buffer_size)
















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章