溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql內(nèi)存參數(shù)分類大全

發(fā)布時(shí)間:2020-08-09 18:33:52 來(lái)源:ITPUB博客 閱讀:211 作者:li__hl8888 欄目:MySQL數(shù)據(jù)庫(kù)

內(nèi)存參數(shù):



存儲(chǔ)引擎/共享
日志緩沖區(qū),緩沖區(qū)池 

innodb_buffer_pool_size
innodb_additional_mem_pool_size
innodb_log_buffer_size 服務(wù)器/共享
查詢調(diào)整緩存
線程高速絡(luò)緩存

query_cache
table_cahce
table_definition_cache

連接/會(huì)話
排序緩沖區(qū),讀取緩沖區(qū),臨時(shí)表

binlog_cache_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
sort_buffer_size
tmp_table_size
thread_cache_size
bulk_insert_buffer_size
net_buffer_length
thread_stack

下面轉(zhuǎn)載自:http://www.bitscn.com/pdb/mysql/201405/227583.html

*.線程獨(dú)享內(nèi)存
*.全局共享內(nèi)存
全局共享內(nèi)存類似ORACLE的系統(tǒng)全局區(qū)SGA,線程獨(dú)享內(nèi)存類似ORACLE的進(jìn)程全局區(qū)PGA

一、線程獨(dú)享內(nèi)存


在MySQL中,線程獨(dú)享內(nèi)存主要用于各客戶端連接線程存儲(chǔ)各種操作的獨(dú)享數(shù)據(jù),如線程棧信息,分組排序操作,數(shù)據(jù)讀寫緩沖,結(jié)果集暫存等等,而且大多數(shù)可以通過(guò)相關(guān)參數(shù)來(lái)控制內(nèi)存的使用量。

* 線程棧信息使用內(nèi)存(thread_stack):
主要用來(lái)存放每一個(gè)線程自身的標(biāo)識(shí)信息,如線程id,線程運(yùn)行時(shí)基本信息等等,我們可以通過(guò) thread_stack 參數(shù)來(lái)設(shè)置為每一個(gè)線程棧分配多大的內(nèi)存。
Global,No Dynamic,Default 192K(32bit), 256K(32bit),
推薦配置:默認(rèn)

* 排序使用內(nèi)存(sort_buffer_size):
MySQL 用此內(nèi)存區(qū)域進(jìn)行排序操作(filesort),完成客戶端的排序請(qǐng)求。當(dāng)我們?cè)O(shè)置的排序區(qū)緩存大小無(wú)法滿足排序?qū)嶋H所需內(nèi)存的時(shí)候,MySQL會(huì)將數(shù)據(jù)寫入磁盤文件來(lái)完成排序。由于磁盤和內(nèi)存的讀寫性能完全不在一個(gè)數(shù)量級(jí),
所以sort_buffer_size參數(shù)對(duì)排序操作的性能影響絕對(duì)不可小視。排序操作的實(shí)現(xiàn)原理請(qǐng)參考:MySQL Order By的實(shí)現(xiàn)分析。
什么時(shí)候會(huì)用到?
對(duì)結(jié)果集排序時(shí)
使用確認(rèn):
可以通過(guò)查詢計(jì)劃中的Extra列的值為Using file-sort來(lái)證實(shí)使用了和這個(gè)緩沖區(qū)。
>explain select * from user1;
Global Session,Dynamic,Default 2M(32bit), 2M(32bit),
推薦配置:8M(內(nèi)存足夠的情況下),默認(rèn)(內(nèi)存緊張的情況)
優(yōu)化建議:一種說(shuō)法是增大可以提高order by,group by性能,防止數(shù)據(jù)寫入磁盤占用IO資源,還有一種說(shuō)法是不推薦增加這個(gè)緩沖區(qū)的大小,理由是當(dāng)值太大時(shí)可能會(huì)降低查詢的執(zhí)行速度。目前我沒(méi)有實(shí)驗(yàn)證實(shí)。

* Join操作使用內(nèi)存(join_buffer_size):
應(yīng)用程序經(jīng)常會(huì)出現(xiàn)一些兩表(或多表)Join的操作需求,MySQL在完成某些Join需求的時(shí)候(all/index join),為了減少參與Join的“被驅(qū)動(dòng)表”的讀取次數(shù)以提高性能,需要使用到Join Buffer來(lái)協(xié)助完成Join操作
(具體Join實(shí)現(xiàn)算法請(qǐng)參考:MySQL中的 Join 基本實(shí)現(xiàn)原理)。當(dāng)Join Buffer太小,MySQL 不會(huì)將該Buffer存入磁盤文件,而是先將Join Buffer中的結(jié)果集與需要Join的表進(jìn)行Join操作,然后清空J(rèn)oin Buffer中的數(shù)據(jù),
繼續(xù)將剩余的結(jié)果集寫入此Buffer中,如此往復(fù)。這勢(shì)必會(huì)造成被驅(qū)動(dòng)表需要被多次讀取,成倍增加IO訪問(wèn),降低效率。
什么時(shí)候會(huì)用到?
當(dāng)查詢必須連接兩個(gè)表(或多個(gè))的數(shù)據(jù)集并且不能使用索引時(shí),這個(gè)緩沖區(qū)會(huì)被用到。這個(gè)緩沖區(qū)專門為每個(gè)線程的無(wú)索引鏈接操作準(zhǔn)備的。
使用確認(rèn):
可以通過(guò)查詢計(jì)劃中的Extra列的值為Using join bufer來(lái)證實(shí)使用了和這個(gè)緩沖區(qū)。
>explain select * from user1;
+------+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | user1 | index | NULL | name | 78 | NULL | 3 | Using index |
+------+-------------+-------+-------+---------------+------+---------+------+------+-------------+
Global Session,Dynamic,Default 128K 各版本平臺(tái)最大值不一樣
推薦配置:8M(內(nèi)存足夠的情況下),默認(rèn)(內(nèi)存緊張的情況)
優(yōu)化建議:有一種說(shuō)法是增加這個(gè)緩沖區(qū)的大小不會(huì)加快全連接操作的速度。目前我沒(méi)有實(shí)驗(yàn)證實(shí)。

* 順序讀取數(shù)據(jù)緩沖區(qū)使用內(nèi)存(read_buffer_size):
這部分內(nèi)存主要用于當(dāng)需要順序讀取數(shù)據(jù)的時(shí)候,如無(wú)法使用索引的情況下的全表掃描,全索引掃描等。在這種時(shí)候,MySQL按照數(shù)據(jù)的存儲(chǔ)順序依次讀取數(shù)據(jù)塊,每次讀取的數(shù)據(jù)快首先會(huì)暫存在read_buffer_size中,
當(dāng)buffer空間被寫滿或者全部數(shù)據(jù)讀取結(jié)束后,再將buffer中的數(shù)據(jù)返回給上層調(diào)用者,以提高效率。
Global Session,Dynamic,Default 128K
推薦配置:4M/8M * 隨機(jī)讀取數(shù)據(jù)緩沖區(qū)使用內(nèi)存(read_rnd_buffer_size):
和順序讀取相反,當(dāng)MySQL進(jìn)行非順序讀?。S機(jī)讀?。?shù)據(jù)塊的時(shí)候,會(huì)利用這個(gè)緩沖區(qū)暫存讀取的數(shù)據(jù)。如根據(jù)索引信息讀取表數(shù)據(jù),根據(jù)排序后的結(jié)果集與表進(jìn)行Join等等。
總的來(lái)說(shuō),就是當(dāng)數(shù)據(jù)塊的讀取需要滿足一定的順序的情況下,MySQL就需要產(chǎn)生隨機(jī)讀取,進(jìn)而使用到read_rnd_buffer_size 參數(shù)所設(shè)置的內(nèi)存緩沖區(qū)。
Global Session,Dynamic,Default 256K
推薦配置:8M * 連接信息及返回客戶端前結(jié)果集暫存使用內(nèi)存(net_buffer_lenth):
這部分用來(lái)存放客戶端連接線程的連接信息和返回客戶端的結(jié)果集。當(dāng)MySQL開(kāi)始產(chǎn)生可以返回的結(jié)果集,會(huì)在通過(guò)網(wǎng)絡(luò)返回給客戶端請(qǐng)求線程之前,會(huì)先暫存在通過(guò)net_buffer_lenth所設(shè)置的緩沖區(qū)中,
等滿足一定大小的時(shí)候才開(kāi)始向客戶端發(fā)送,以提高網(wǎng)絡(luò)傳輸效率。不過(guò)net_buffer_lenth參數(shù)所設(shè)置的僅僅只是該緩存區(qū)的初始化大小,MySQL會(huì)根據(jù)實(shí)際需要自行申請(qǐng)更多的內(nèi)存以滿足需求,
但最大不會(huì)超過(guò) max_allowed_packet 參數(shù)大小。
Global Session,Dynamic,Default 16K
推薦配置:默認(rèn) 16K

* 批量插入暫存使用內(nèi)存(bulk_insert_buffer_size):
當(dāng)我們使用如 insert … values(…),(…),(…)… 的方式進(jìn)行批量插入的時(shí)候,MySQL會(huì)先將提交的數(shù)據(jù)放如一個(gè)緩存空間中,當(dāng)該緩存空間被寫滿或者提交完所有數(shù)據(jù)之后,MySQL才會(huì)一次性將該緩存空間中的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)并清空緩存。
此外,當(dāng)我們進(jìn)行 LOAD DATA INFILE操作來(lái)將文本文件中的數(shù)據(jù)Load進(jìn)數(shù)據(jù)庫(kù)的時(shí)候,同樣會(huì)使用到此緩沖區(qū)。
Global Session,Dynamic,Default 8M
推薦配置:默認(rèn) 8M
* 臨時(shí)表使用內(nèi)存(tmp_table_size):
當(dāng)我們進(jìn)行一些特殊操作如需要使用臨時(shí)表才能完成的Order By,Group By 等等,MySQL可能需要使用到臨時(shí)表。當(dāng)我們的臨時(shí)表較小(小于tmp_table_size 參數(shù)所設(shè)置的大?。┑臅r(shí)候,MySQL會(huì)將臨時(shí)表創(chuàng)建成內(nèi)存臨時(shí)表,
只有當(dāng)tmp_table_size所設(shè)置的大小無(wú)法裝下整個(gè)臨時(shí)表的時(shí)候,MySQL才會(huì)將該表創(chuàng)建成MyISAM存儲(chǔ)引擎的表存放在磁盤上。不過(guò),當(dāng)另一個(gè)系統(tǒng)參數(shù) max_heap_table_size 的大小還小于 tmp_table_size 的時(shí)候,
MySQL將使用 max_heap_table_size 參數(shù)所設(shè)置大小作為最大的內(nèi)存臨時(shí)表大小,而忽略tmp_table_size 所設(shè)置的值。而且 tmp_table_size 參數(shù)從 MySQL 5.1.2 才開(kāi)始有,之前一直使用 max_heap_table_size。
誰(shuí)小誰(shuí)生效.另外還有一個(gè)參數(shù)max_tmp_tables,沒(méi)有使用
tmp_table_size
Global Session,Dynamic,Default 16M
推薦配置:64M
max_heap_table_size
Global Session,Dynamic,Default 8M
This variable sets the maximum size to which user-created MEMORY tables are permitted to grow
這個(gè)變量定義了MEMORY存儲(chǔ)引擎表的最大容量。
This variable is also used in conjunction with tmp_table_size to limit the size of internal in-memory tables. See
這個(gè)變量也與tmp_table_size一起使用限制內(nèi)部?jī)?nèi)存表的大小。請(qǐng)見(jiàn)
http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html
推薦配置:64M
主要根據(jù)業(yè)務(wù)以及服務(wù)器內(nèi)存來(lái)調(diào)整,如果有需要到則可以調(diào)整到。GB居然使用2G的配置,汗

目前沒(méi)有一個(gè)簡(jiǎn)便的方式來(lái)確定內(nèi)部臨時(shí)表的總?cè)萘???梢酝ㄟ^(guò)MySQL狀態(tài)變量created_tmp_tables和created_tmp_disk_tables來(lái)確定創(chuàng)建了臨時(shí)表和基于磁盤的臨時(shí)表
mysql> show global status like 'create%tables';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0 |
| Created_tmp_tables | 0 |
+-------------------------+-------+
5.5中,可以使用PERFORMANCE—SCHEMA來(lái)幫助統(tǒng)計(jì)基于磁盤的臨時(shí)表的總大小

補(bǔ)充說(shuō)明:上面所列舉的MySQL線程獨(dú)享內(nèi)存僅僅只是所有線程獨(dú)享內(nèi)存中的部分,并不是全部,只是這些可能對(duì)MySQL的性能產(chǎn)生較大的影響,且可以通過(guò)系統(tǒng)參數(shù)進(jìn)行調(diào)節(jié)。
由于以上內(nèi)存都是線程獨(dú)享,極端情況下的內(nèi)存總體使用量將是所有連接線程的總倍數(shù)。所以在設(shè)置過(guò)程中一定要謹(jǐn)慎,切不可為了提升性能就盲目的增大各參數(shù)值,
避免因?yàn)閮?nèi)存不夠而產(chǎn)生Out Of Memory異?;蛘呤菄?yán)重的Swap交換反而降低整體性能。

二、全局共享內(nèi)存

全局共享內(nèi)則主要是MySQL Instance以及底層存儲(chǔ)引擎用來(lái)暫存各種全局運(yùn)算及可共享的暫存信息,如
存儲(chǔ)查詢緩存的 Query Cache,
緩存連接線程的 Thread Cache,
緩存表文件句柄信息的 Table Cache,
緩存二進(jìn)制日志的 BinLog Buffer,
緩存MyISAM存儲(chǔ)引擎索引鍵的 Key Buffer
存儲(chǔ)InnoDB數(shù)據(jù)和索引的 InnoDB Buffer Pool
等等。下面針對(duì) MySQL 主要的共享內(nèi)存進(jìn)行一個(gè)簡(jiǎn)單的分析。

* MyISAM索引緩存 Key Buffer(key_buffer_size):
MyISAM 索引緩存將MyISAM表的索引信息(.MYI文件)緩存在內(nèi)存中,以提高其訪問(wèn)性能。這個(gè)緩存可以說(shuō)是影響MyISAM存儲(chǔ)引擎性能的最重要因素之一了,通過(guò) key_buffere_size 設(shè)置可以使用的最大內(nèi)存空間。
注意:即使運(yùn)行一個(gè)全部采用innodb的模式,仍需要定義一個(gè)索引碼緩沖區(qū),因?yàn)镸YSQL元信息與MyISAM定義相同。
Global ,Dynamic,Default 8M
推薦配置:默認(rèn) 8M
如何確認(rèn)key_buffer_size不夠用?
使用show full proceslist的State列中,值Repairing the keycache是一個(gè)明顯的指標(biāo),它指出當(dāng)前索引碼緩沖區(qū)大小不足以執(zhí)行當(dāng)前運(yùn)行的SQL語(yǔ)句。這將導(dǎo)致額外的磁盤I/O開(kāi)銷。

* 查詢緩存 Query Cache (query_cache_size):
http://dev.mysql.com/doc/refman/5.5/en/query-cache-configuration.html
http://dev.mysql.com/doc/refman/5.5/en/query-cache-status-and-maintenance.html
查詢緩存是MySQL比較獨(dú)特的一個(gè)緩存區(qū)域,用來(lái)緩存特定Query的結(jié)果集(Result Set)信息,且共享給所有客戶端。通過(guò)對(duì)Query語(yǔ)句進(jìn)行特定的Hash計(jì)算之后與結(jié)果集對(duì)應(yīng)存放在Query Cache中,以提高完全相同的Query語(yǔ)句的相應(yīng)速度。
當(dāng)我們打開(kāi)MySQL的Query Cache之后,MySQL接收到每一個(gè)SELECT類型的Query之后都會(huì)首先通過(guò)固定的Hash算法得到該Query的Hash值,然后到Query Cache中查找是否有對(duì)應(yīng)的Query Cache。如果有,則直接將Cache的結(jié)果集返回給客戶端。
如果沒(méi)有,再進(jìn)行后續(xù)操作,得到對(duì)應(yīng)的結(jié)果集之后將該結(jié)果集緩存到Query Cache中,再返回給客戶端。當(dāng)任何一個(gè)表的數(shù)據(jù)發(fā)生任何變化之后,與該表相關(guān)的所有Query Cache全部會(huì)失效,所以Query Cache對(duì)變更比較頻繁的表并不是非常適用,
但對(duì)那些變更較少的表是非常合適的,可以極大程度的提高查詢效率,如那些靜態(tài)資源表,配置表等等。為了盡可能高效的利用Query Cache,MySQL針對(duì)Query Cache設(shè)計(jì)了多個(gè)query_cache_type值
和兩個(gè)Query Hint:SQL_CACHE和SQL_NO_CACHE。當(dāng)query_cache_type設(shè)置為0(或者 OFF)的時(shí)候不使用Query Cache,當(dāng)設(shè)置為1(或者 ON)的時(shí)候,當(dāng)且僅當(dāng)Query中使用了SQL_NO_CACHE 的時(shí)候MySQL會(huì)忽略Query Cache,
當(dāng)query_cache_type設(shè)置為2(或者DEMAND)的時(shí)候,當(dāng)且僅當(dāng)Query中使用了SQL_CACHE提示之后,MySQL才會(huì)針對(duì)該Query使用Query Cache??梢酝ㄟ^(guò)query_cache_size來(lái)設(shè)置可以使用的最大內(nèi)存空間。
Global Dynamic,Default 0
推薦配置:16M
如何確定系統(tǒng)query cache的情況?
show global status like 'Qcache%';或者
select * from information_schema.GLOBAL_STATUS where VARIABLE_NAME like 'Qcache%';
公式:
(Qcache_hits/Qcache_hits+Com_select+1)*100來(lái)確定查詢緩存的有效性
mysql> show variables like 'query_cache_size';
+------------------+----------+
| Variable_name | Value |
+------------------+----------+
| query_cache_size | 16777216 |
+------------------+----------+
1 row in set (0.00 sec)
mysql> show global status like 'Qcache%';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| Qcache_free_blocks | 535 |
| Qcache_free_memory | 4885448 |
| Qcache_hits | 1858574835 |
| Qcache_inserts | 1619931831 |
| Qcache_lowmem_prunes | 802889469 |
| Qcache_not_cached | 825000679 |
| Qcache_queries_in_cache | 4411 |
| Qcache_total_blocks | 9554 |
+-------------------------+------------+
8 rows in set (0.00 sec)
mysql> show global status like 'Com_select';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| Com_select | 2445037535 |
+---------------+------------+
1 row in set (0.00 sec) * 連接線程緩存 Thread Cache(thread_cache_size):
連接線程是MySQL為了提高創(chuàng)建連接線程的效率,將部分空閑的連接線程保持在一個(gè)緩存區(qū)以備新進(jìn)連接請(qǐng)求的時(shí)候使用,這尤其對(duì)那些使用短連接的應(yīng)用程序來(lái)說(shuō)可以極大的提高創(chuàng)建連接的效率。
當(dāng)我們通過(guò)thread_cache_size設(shè)置了連接線程緩存池可以緩存的連接線程的大小之后,可以通過(guò)(Connections - Threads_created) / Connections * 100% 計(jì)算出連接線程緩存的命中率。
注意,這里設(shè)置的是可以緩存的連接線程的數(shù)目,而不是內(nèi)存空間的大小。
Global,Dynamic,Default 0
推薦配置:8個(gè)
如何確定系統(tǒng)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% 很高的命中率啊 這臺(tái)之只讀的slave * 表緩存 Table Cache(table_open_cache):
表緩存區(qū)主要用來(lái)緩存表文件的文件句柄信息,在 MySQL5.1.3之前的版本通過(guò)table_cache參數(shù)設(shè)置,但從MySQL5.1.3開(kāi)始改為table_open_cache來(lái)設(shè)置其大小。當(dāng)我們的客戶端程序提交Query給MySQL的時(shí)候,
MySQL需要對(duì)Query所涉及到的每一個(gè)表都取得一個(gè)表文件句柄信息,如果沒(méi)有Table Cache,那么MySQL就不得不頻繁的進(jìn)行打開(kāi)關(guān)閉文件操作,無(wú)疑會(huì)對(duì)系統(tǒng)性能產(chǎn)生一定的影響,Table Cache 正是為了解決這一問(wèn)題而產(chǎn)生的。
在有了Table Cache之后,MySQL每次需要獲取某個(gè)表文件的句柄信息的時(shí)候,首先會(huì)到Table Cache中查找是否存在空閑狀態(tài)的表文件句柄。如果有,則取出直接使用,沒(méi)有的話就只能進(jìn)行打開(kāi)文件操作獲得文件句柄信息。
在使用完之后,MySQL會(huì)將該文件句柄信息再放回Table Cache 池中,以供其他線程使用。注意,這里設(shè)置的是可以緩存的表文件句柄信息的數(shù)目,而不是內(nèi)存空間的大小。
Global,Dynamic,Default 400
推薦配置:根據(jù)內(nèi)存配置4G 2048 大于最大Opened_tables
如何確定系統(tǒng)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 |
+---------------+-------+
2 rows in set (0.00 sec)
調(diào)優(yōu)參考:
http://blog.zfcms.com/article/282
http://www.kuqin.com/database/20120815/328904.html
兩個(gè)參數(shù)的值。其中Open_tables是當(dāng)前正在打開(kāi)表的數(shù)量,Opened_tables是所有已經(jīng)打開(kāi)表的數(shù)量。
如果Open_tables的值已經(jīng)接近table_cache的值,且Opened_tables還在不斷變大,則說(shuō)明mysql正在將緩存的表釋放以容納新的表,此時(shí)可能需要加大table_cache的值。對(duì)于大多數(shù)情況,比較適合的值:
Open_tables / Opened_tables >= 0.85
Open_tables / table_cache <= 0.95
如果對(duì)此參數(shù)的把握不是很準(zhǔn),VPS管理百科給出一個(gè)很保守的設(shè)置建議:把MySQL數(shù)據(jù)庫(kù)放在生產(chǎn)環(huán)境中試運(yùn)行一段時(shí)間,然后把參數(shù)的值調(diào)整得比Opened_tables的數(shù)值大一些,并且保證在比較高負(fù)載的極端條件下依然比Opened_tables略大。
在mysql默認(rèn)安裝情況下,table_cache的值在2G內(nèi)存以下的機(jī)器中的值默認(rèn)時(shí)256到 512,如果機(jī)器有4G內(nèi)存,則默認(rèn)這個(gè)值是2048,

* 表定義信息緩存 Table definition Cache (table_definition_cache):
表定義信息緩存是從 MySQL5.1.3 版本才開(kāi)始引入的一個(gè)新的緩存區(qū),用來(lái)存放表定義信息。當(dāng)我們的 MySQL 中使用了較多的表的時(shí)候,此緩存無(wú)疑會(huì)提高對(duì)表定義信息的訪問(wèn)效率。
MySQL 提供了 table_definition_cache 參數(shù)給我們?cè)O(shè)置可以緩存的表的數(shù)量。注意,這里設(shè)置的是可以緩存的表定義信息的數(shù)目,而不是內(nèi)存空間的大小。
The number of table definitions (from .frm files) that can be stored in the definition cache. If you use a large number of tables, you can create a large table definition cache to speed up opening of tables.
Global, Dynamic, Default 400
推薦配置:根據(jù)內(nèi)存配置4G 2048 和Table Cache一樣即可

* 二進(jìn)制日志緩沖區(qū)Binlog Cache( binlog_cache_size):
二進(jìn)制日志緩沖區(qū)主要用來(lái)緩存由于各種數(shù)據(jù)變更操做所產(chǎn)生的 Binary Log 信息。為了提高系統(tǒng)的性能,MySQL 并不是每次都是將二進(jìn)制日志直接寫入 Log File,而是先將信息寫入 Binlog Buffer 中,
當(dāng)滿足某些特定的條件(如 sync_binlog參數(shù)設(shè)置)之后再一次寫入 Log File 中。我們可以通過(guò) binlog_cache_size 來(lái)設(shè)置其可以使用的內(nèi)存大小,同時(shí)通過(guò) max_binlog_cache_size 限制其最大大小
(當(dāng)單個(gè)事務(wù)過(guò)大的時(shí)候 MySQL 會(huì)申請(qǐng)更多的內(nèi)存)。當(dāng)所需內(nèi)存大于 max_binlog_cache_size 參數(shù)設(shè)置的時(shí)候,MySQL 會(huì)報(bào)錯(cuò):“Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage”。
Global,Dynamic,Default 32K
推薦配置:2M

* InnoDB 日志緩沖區(qū) InnoDB Log Buffer (innodb_log_buffer_size):
這是 InnoDB 存儲(chǔ)引擎的事務(wù)日志所使用的緩沖區(qū)。類似于 Binlog Buffer,InnoDB 在寫事務(wù)日志的時(shí)候,為了提高性能,也是先將信息寫入 Innofb Log Buffer 中,當(dāng)滿足 innodb_flush_log_trx_commit 參數(shù)所設(shè)置的相應(yīng)條件(或者日志緩沖區(qū)寫滿)之后,才會(huì)將日志寫到文件(或者同步到磁盤)中。可以通過(guò) innodb_log_buffer_size 參數(shù)設(shè)置其可以使用的最大內(nèi)存空間。
注:innodb_flush_log_trx_commit 參數(shù)對(duì) InnoDB Log 的寫入性能有非常關(guān)鍵的影響。該參數(shù)可以設(shè)置為0,1,2,解釋如下:

0:log buffer中的數(shù)據(jù)將以每秒一次的頻率寫入到log file中,且同時(shí)會(huì)進(jìn)行文件系統(tǒng)到磁盤的同步操作,但是每個(gè)事務(wù)的commit并不會(huì)觸發(fā)任何log buffer 到log file的刷新或者文件系統(tǒng)到磁盤的刷新操作;
1:在每次事務(wù)提交的時(shí)候?qū)og buffer 中的數(shù)據(jù)都會(huì)寫入到log file,同時(shí)也會(huì)觸發(fā)文件系統(tǒng)到磁盤的同步;
2:事務(wù)提交會(huì)觸發(fā)log buffer 到log file的刷新,但并不會(huì)觸發(fā)磁盤文件系統(tǒng)到磁盤的同步。此外,每秒會(huì)有一次文件系統(tǒng)到磁盤同步操作。
此外,MySQL文檔中還提到,這幾種設(shè)置中的每秒同步一次的機(jī)制,可能并不會(huì)完全確保非常準(zhǔn)確的每秒就一定會(huì)發(fā)生同步,還取決于進(jìn)程調(diào)度的問(wèn)題。實(shí)際上,InnoDB 能否真正滿足此參數(shù)所設(shè)置值代表的意義正常 Recovery 還是受到了不同 OS 下文件系統(tǒng)以及磁盤本身的限制,可能有些時(shí)候在并沒(méi)有真正完成磁盤同步的情況下也會(huì)告訴 mysqld 已經(jīng)完成了磁盤同步。

Global,Dynamic,Default 8M
推薦配置:8M 默認(rèn)

* InnoDB 數(shù)據(jù)和索引緩存 InnoDB Buffer Pool(innodb_buffer_pool_size):
InnoDB Buffer Pool 對(duì) InnoDB 存儲(chǔ)引擎的作用類似于 Key Buffer Cache 對(duì) MyISAM 存儲(chǔ)引擎的影響,主要的不同在于 InnoDB Buffer Pool 不僅僅緩存索引數(shù)據(jù),還會(huì)緩存表的數(shù)據(jù),
而且完全按照數(shù)據(jù)文件中的數(shù)據(jù)快結(jié)構(gòu)信息來(lái)緩存,這一點(diǎn)和 Oracle SGA 中的 database buffer cache 非常類似。所以,InnoDB Buffer Pool 對(duì) InnoDB 存儲(chǔ)引擎的性能影響之大就可想而知了。
可以通過(guò) (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計(jì)算得到 InnoDB Buffer Pool 的命中率。
global級(jí)別,不可動(dòng)態(tài)變更 Default 128M
設(shè)置InnoDB數(shù)據(jù)和索引內(nèi)存緩存空間大小
配置方式:配置文件中配置
選擇參數(shù):50 - 80 % RAM

mysql> show variables like '%innodb_buffer%';
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_size | 268435456 |
+------------------------------+-----------+
2 rows in set (0.00 sec)
通過(guò)show global status和show engine innodb status/G的BUFFER POOL AND MEMORY
mysql> show global status like '%innodb_buffer%';
+---------------------------------------+--------------+
| Variable_name | Value |
+---------------------------------------+--------------+
| Innodb_buffer_pool_pages_data | 15684 |
| Innodb_buffer_pool_bytes_data | 256966656 |
| Innodb_buffer_pool_pages_dirty | 210 |
| Innodb_buffer_pool_bytes_dirty | 3440640 |
| Innodb_buffer_pool_pages_flushed | 372378403 |
| Innodb_buffer_pool_pages_free | 1 |
| Innodb_buffer_pool_pages_misc | 698 |
| Innodb_buffer_pool_pages_total | 16383 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 691803 |
| Innodb_buffer_pool_read_ahead_evicted | 41350 |
| Innodb_buffer_pool_read_requests | 170965099291 |
| Innodb_buffer_pool_reads | 5392513 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 5825388207 |
+---------------------------------------+--------------+
15 rows in set (0.01 sec)

mysql> show engine innodb status/G
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 274726912; in additional pool allocated 0
Dictionary memory allocated 4055091
Buffer pool size 16383
Free buffers 1
Database pages 15673
Old database pages 5765
Modified db pages 521
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 27497746, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 6346456, created 1902566, written 372381712
0.00 reads/s, 0.37 creates/s, 27.75 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 15673, unzip_LRU len: 0
I/O sum[1107]:cur[0], unzip sum[0]:cur[0]
命中率 Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%
170965099291-5392513/170965099291 × 100% = 99.99%

* InnoDB 字典信息緩存 InnoDB Additional Memory Pool(innodb_additional_mem_pool_size):
InnoDB 字典信息緩存主要用來(lái)存放 InnoDB 存儲(chǔ)引擎的字典信息以及一些 internal 的共享數(shù)據(jù)結(jié)構(gòu)信息。所以其大小也與系統(tǒng)中所使用的 InnoDB 存儲(chǔ)引擎表的數(shù)量有較大關(guān)系。不過(guò),如果我們通過(guò) innodb_additional_mem_pool_size 參數(shù)所設(shè)置的內(nèi)存大小不夠,InnoDB 會(huì)自動(dòng)申請(qǐng)更多的內(nèi)存,并在 MySQL 的 Error Log 中記錄警告信息。
global級(jí)別,不可動(dòng)態(tài)變更 Default 8M
設(shè)置InnoDB存放數(shù)據(jù)庫(kù)字典信息的Buffer大小
推薦配置:50M

三、查看統(tǒng)計(jì)

1.查看各參數(shù)內(nèi)存配置方式
#全局共享內(nèi)存 9個(gè)變量
show variables like 'innodb_buffer_pool_size'; /* InnoDB 數(shù)據(jù)和索引緩存(InnoDB Buffer Pool) */
show variables like 'innodb_additional_mem_pool_size'; /* InnoDB 字典信息緩存(InnoDB Additional Memory Pool)*/
show variables like 'innodb_log_buffer_size'; /* InnoDB 日志緩沖區(qū)(InnoDB Log Buffer) */
show variables like 'binlog_cache_size'; /* 二進(jìn)制日志緩沖區(qū)(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) */
#最大線程數(shù)
show variables like 'max_connections';
#線程獨(dú)享內(nèi)存 6個(gè)變量
show variables like 'thread_stack'; /* 線線程棧信息使用內(nèi)存(thread_stack) */
show variables like 'sort_buffer_size'; /* 排序使用內(nèi)存(sort_buffer_size) */
show variables like 'join_buffer_size'; /* Join操作使用內(nèi)存(join_buffer_size) */
show variables like 'read_buffer_size'; /* 順序讀取數(shù)據(jù)緩沖區(qū)使用內(nèi)存(read_buffer_size) */
show variables like 'read_rnd_buffer_size'; /* 隨機(jī)讀取數(shù)據(jù)緩沖區(qū)使用內(nèi)存(read_rnd_buffer_size) */
show variables like 'tmp_table_size'; /* 臨時(shí)表使用內(nèi)存(tmp_table_size) ,我實(shí)際計(jì)算把tmp_table_size放入全局共享內(nèi)*/
也可以通過(guò)系統(tǒng)變量的方式直接獲取
select @@key_buffer_size;
select @@max_connections 2.mysql內(nèi)存計(jì)算公式
mysql使用的內(nèi)存 = 全局共享內(nèi)存+最大線程數(shù)×線程獨(dú)享內(nèi)存
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;

這個(gè)理論最大的內(nèi)存使用量,在5.5版本中tmp_table_size默認(rèn)是16M,按默認(rèn)u自大連接數(shù)151計(jì)算,光線程獨(dú)享的臨時(shí)表占據(jù)的空間都是2416M,我實(shí)際計(jì)算把tmp_table_size放入全局共享內(nèi)
我的計(jì)算公式
mysql使用的內(nèi)存 = 全局共享內(nèi)存+最大線程數(shù)×線程獨(dú)享內(nèi)存
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)

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI