MySQL技術內幕-InnoDB儲存引擎-讀書筆記(一),mysql-innodb
MySQL技術內幕-InnoDB儲存引擎-讀書筆記(一)
作為php開發,使用mysql總是少不了的
部落格連結 http://itsong.net/articles/466.html
第一章 MySQL體繫結構和儲存引擎
- MySQL被設計為一個單進程多線程架構的資料庫
./mysql --help | grep my.cnf
可以查看mysql資料庫執行個體啟動時,它會在哪些位置尋找設定檔。
- 設定檔中有一個datadir參數,指定了資料庫所在的路徑。預設為
/usr/local/mysql/data
。
- 體繫結構,mysql由以下幾部分組成:串連池組件,管理服務和工具組件,sql介面組件,查詢分析器組件,最佳化器組件,緩衝cache組件,外掛程式式儲存引擎,物理檔案。
- InnoDB儲存引擎,支援事務,行鎖,支援外鍵,預設讀操作不產生鎖
- MyISAM儲存引擎,不支援事務,表鎖,全文索引
- unix域通訊端訪問mysql,
-S /tmp/mysql.sock
。
第二章 InnoDB儲存引擎
- 後台線程有7個,4個IO,1個master thread,一個鎖監控線程,1個錯誤監控線程。master thread幾乎實現了所有功能。
- 4個IO線程為,insert buffer thread,log thread,read thread,write thread。
- 引擎記憶體分為:緩衝池buffer pool(最大),重做日誌緩衝池redo log buffer,以及額外的記憶體池additional memory pool。
- 按頁(每頁16K)讀到緩衝池,LRU演算法保留快取資料。先改緩衝池中的頁-髒頁,再按一定頻率將髒頁重新整理flush到檔案
show engine innodb status
可以看緩衝池具體使用方式。
- 緩衝池緩衝的資料頁類型有:索引頁,資料頁,undo頁,插入緩衝,自適應雜湊索引,innodb儲存的鎖資訊,資料字典資訊等。索引頁和資料頁最大。
- 日誌緩衝將重做日誌資訊先放入這個緩衝區,按一定頻率重新整理到重做記錄檔。
- master thread線程優先順序最高,分為幾個迴圈:主迴圈,後台迴圈,重新整理迴圈,暫停迴圈。
- 主迴圈,每秒一次的操作包括日誌緩衝刷到磁碟,即使事務沒提交(所以大事務也很快),合并插入緩衝(可能),至多重新整理100個innodb緩衝池中的髒頁到磁碟(可能),如果沒有使用者活動,切換到後台迴圈(可能)。
- 合并插入緩衝並不是每秒都發生,判斷當前一秒內io次數是否小於5次,io壓力小則執行合并插入緩衝。
- 緩衝池中髒頁比例大於90%,做磁碟同步操作,將100個髒頁寫入磁碟
- 主迴圈,每10秒的操作,重新整理100個髒頁到磁碟(可能),合并至多5個插入緩衝(總是),將日誌緩衝重新整理到磁碟(總是),刪除無用的undo頁(總是),重新整理100個或者10個髒頁到磁碟(總是),產生一個檢查點(總是)。
- 判斷過去10秒磁碟io是否小於200次,ok則刷100個髒頁到磁碟。
- 看髒頁比例,超過70%,重新整理100個髒頁,如果小於70%,重新整理10個髒頁。
- 後台迴圈,刪除無用的undo頁(總是),合并20個插入緩衝(總是),跳回到主迴圈(總是),不斷重新整理100個頁,直到符合條件。
- 調整
innodb_max_dirty_pages_pct
可以加快重新整理髒頁的頻率,保證磁碟io的負載,比如75-80
- 關鍵特性:插入緩衝,兩次寫double write,自適應雜湊索引adaptive hash index。
- 插入緩衝的使用需要滿足兩個條件:索引是輔助索引,索引不是唯一的。