Mysql內存組成能夠分爲SGA(系統全局)和PGA(程序緩存區)
參數 | 用途 |
---|---|
innodb_buffer_pool | 用來緩存innodb表的數據,索引,插入緩存,數據字典等信息 |
innodb_log_buffer | 即redo log buffer 事務在內存中的緩衝 |
query cache | 只能緩存靜態數據信息,建議生產環境關閉,5.6以後默認是關閉的,query_cache_type設置爲off,query_cache_size設置爲0,纔會生效 |
參數 | 用途 |
---|---|
sort_buffer_size | 用戶sql語句在內存中的臨時排序 |
join_buffer_size | 錶鏈接使用,適用於BKA ,該緩存中會保存join字段的數據方便與另一張表進行鏈接 |
read_buffer_size | 表順序掃描的緩存,只適用於MyISAM存儲引擎 |
read_rnd_buffer_size | mysql隨機讀取緩存區大小,用戶作MRR,MRR優化的目的就是爲了減小磁盤的隨機訪問,對於MySQL的二級索引(非彙集索引)而言,過於隨機的回表會形成隨機讀取過於嚴重,範圍掃描(range access)中MySQL將掃描到的數據存入read_rnd_buffer_size,而後對其按照Primary Key(RowID)排序,而後使用排序好的數據進行順序回表,由於咱們知道InnoDB中葉子節點數據是按照PRIMARY KEY(ROWID)進行排列的,那麼這樣就轉換隨機讀取爲順序讀取了 |
tmp_table_size | sql語句在排序/分組時沒有使用到索引,會使用臨時表空間 |
page在InnoDB磁盤I/O最小單位,數據都存放在page中,對應到內存中就是一個個buffer.mysql
buffer狀態sql
1.freeBuffer:該buufer未被使用數據庫
2.cleanBuffer:內存中的buffer與磁盤中的page的數據一致緩存
3.dirtyBuffer:內存中的數據還未被刷到磁盤,和磁盤中的數據不一致oop
buffer由chain來管理,也就是鏈,三種不一樣的buffer生出三條鏈表優化
chain鏈表線程
1.free list :把free buffer串聯起來,使用時不夠用,從lru list和flush list中釋放出free buffer日誌
2.lru list :把最近少訪問到的clean buffer串聯起來釋放出free buffercode
3.flush list : 把dirty buffer串聯起來方便線程將數據刷新到磁盤,釋放更過的free bufferblog
後臺線程中主線程-master thread,其內部有4大循環
1.主循環 loop
操做 | 描述 |
---|---|
每1s操做 | 1.日誌刷新到磁盤,即便事務還沒提交,2.刷新髒頁到磁盤,3.執行合併插入緩衝操做,4.產生checkpoint,5.清楚無用的table cache,6.當前沒有操做切換到background loop |
每10s操做 | 1.日誌刷新到磁盤,即便事務還沒提交,2.刷新髒頁到磁盤,3.執行合併插入緩衝操做,4.產生checkpoint,5.刪除無用的undo |
2.後臺循環 background loop
3.刷新循環 flush loop
4.暫停循環 supsend loop
4大I/O線程
1.read thread:讀請求線程(默認值都是4個,能夠適當調大)
2.write thread:寫請求線程(默認值都是4個,能夠適當調大)
3.redo log thread:負責把日誌緩衝區的內容刷新到redo log(默認值都是4個,能夠適當調大)
4.changge buffer threD:把插入緩衝區內容刷新到磁盤(默認值都是4個,能夠適當調大)
其餘線程 1.page clean tread:將髒頁刷到緩存中,能夠調爲多個
2.purge thread:刪除無用的undo頁,經過innodb_purge_thread參數調整線程數默認是1個,最大調整爲32個
3.error monitor thread:負責數據庫報錯的線程
4.lock monitor thread:負責監控鎖的線程