內(nèi)存結(jié)構(gòu)
Mysql內(nèi)存組成可以分為SGA(系統(tǒng)全局)和PGA(程序緩存區(qū))
參數(shù)用途
innodb_buffer_pool用來(lái)緩存innodb表的數(shù)據(jù),索引,插入緩存,數(shù)據(jù)字典等信息
innodb_log_buffer即redo log buffer 事務(wù)在內(nèi)存中的緩沖
query cache只能緩存靜態(tài)數(shù)據(jù)信息,建議生產(chǎn)環(huán)境關(guān)閉,5.6之后默認(rèn)是關(guān)閉的,query_cache_type設(shè)置為off,query_cache_size設(shè)置為0膜廊,才會(huì)生效
參數(shù)用途
sort_buffer_size用戶sql語(yǔ)句在內(nèi)存中的臨時(shí)排序
join_buffer_size表連接使用,適用于BKA 宣肚,該緩存中會(huì)保存join字段的數(shù)據(jù)方便與另外一張表進(jìn)行連接
read_buffer_size表順序掃描的緩存,只適用于MyISAM存儲(chǔ)引擎
read_rnd_buffer_sizemysql隨機(jī)讀取緩存區(qū)大小,用戶做MRR,MRR優(yōu)化的目的就是為了減少磁盤的隨機(jī)訪問(wèn),對(duì)于MySQL的二級(jí)索引(非聚集索引)而言悠栓,過(guò)于隨機(jī)的回表會(huì)造成隨機(jī)讀取過(guò)于嚴(yán)重霉涨,范圍掃描(range access)中MySQL將掃描到的數(shù)據(jù)存入read_rnd_buffer_size,然后對(duì)其按照Primary Key(RowID)排序惭适,然后使用排序好的數(shù)據(jù)進(jìn)行順序回表笙瑟,因?yàn)槲覀冎繧nnoDB中葉子節(jié)點(diǎn)數(shù)據(jù)是按照PRIMARY KEY(ROWID)進(jìn)行排列的,那么這樣就轉(zhuǎn)換隨機(jī)讀取為順序讀取了
tmp_table_sizesql語(yǔ)句在排序/分組時(shí)沒有使用到索引,會(huì)使用臨時(shí)表空間
page在InnoDB磁盤I/O最小單位,數(shù)據(jù)都存放在page中,對(duì)應(yīng)到內(nèi)存中就是一個(gè)個(gè)buffer.
buffer狀態(tài)
1.freeBuffer:該buufer未被使用
2.cleanBuffer:內(nèi)存中的buffer與磁盤中的page的數(shù)據(jù)一致
3.dirtyBuffer:內(nèi)存中的數(shù)據(jù)還未被刷到磁盤,和磁盤中的數(shù)據(jù)不一致
buffer由chain來(lái)管理,也就是鏈,三種不同的buffer生出三條鏈表
chain鏈表
1.free list :把free buffer串聯(lián)起來(lái)癞志,使用時(shí)不夠用往枷,從lru list和flush list中釋放出free buffer
2.lru list :把最近少訪問(wèn)到的clean buffer串聯(lián)起來(lái)釋放出free buffer
3.flush list : 把dirty buffer串聯(lián)起來(lái)方便線程將數(shù)據(jù)刷新到磁盤,釋放更過(guò)的free buffer
后臺(tái)線程中主線程-master thread,其內(nèi)部有4大循環(huán)
1.主循環(huán) loop
操作描述
每1s操作1.日志刷新到磁盤,即使事務(wù)還沒提交,2.刷新臟頁(yè)到磁盤,3.執(zhí)行合并插入緩沖操作错洁,4.產(chǎn)生checkpoint,5.清楚無(wú)用的table cache,6.當(dāng)前沒有操作切換到background loop
每10s操作1.日志刷新到磁盤,即使事務(wù)還沒提交,2.刷新臟頁(yè)到磁盤,3.執(zhí)行合并插入緩沖操作秉宿,4.產(chǎn)生checkpoint,5.刪除無(wú)用的undo
2.后臺(tái)循環(huán) background loop
3.刷新循環(huán) flush loop
4.暫停循環(huán) supsend loop
4大I/O線程
1.read thread:讀請(qǐng)求線程(默認(rèn)值都是4個(gè),可以適當(dāng)調(diào)大)
2.write thread:寫請(qǐng)求線程(默認(rèn)值都是4個(gè)屯碴,可以適當(dāng)調(diào)大)
3.redo log thread:負(fù)責(zé)把日志緩沖區(qū)的內(nèi)容刷新到redo log(默認(rèn)值都是4個(gè)描睦,可以適當(dāng)調(diào)大)
4.changge buffer threD:把插入緩沖區(qū)內(nèi)容刷新到磁盤(默認(rèn)值都是4個(gè),可以適當(dāng)調(diào)大)
其他線程
1.page clean tread:將臟頁(yè)刷到緩存中导而,可以調(diào)為多個(gè)
2.purge thread:刪除無(wú)用的undo頁(yè),通過(guò)innodb_purge_thread參數(shù)調(diào)整線程數(shù)默認(rèn)是1個(gè),最大調(diào)整為32個(gè)
3.error monitor thread:負(fù)責(zé)數(shù)據(jù)庫(kù)報(bào)錯(cuò)的線程
4.lock monitor thread:負(fù)責(zé)監(jiān)控鎖的線程