Mysql以內存結構

內存結構

Mysql內存組成能夠分爲SGA(系統全局)和PGA(程序緩存區)

內存參數配置

SGA內存主要構成

參數 用途
innodb_buffer_pool 用來緩存innodb表的數據,索引,插入緩存,數據字典等信息
innodb_log_buffer 即redo log buffer 事務在內存中的緩衝
query cache 只能緩存靜態數據信息,建議生產環境關閉,5.6以後默認是關閉的,query_cache_type設置爲off,query_cache_size設置爲0,纔會生效

PGA內存主要構成

參數 用途
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語句在排序/分組時沒有使用到索引,會使用臨時表空間

Buffer狀態及其鏈表結構

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:負責監控鎖的線程

相關文章
相關標籤/搜索