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。
插入緩沖的使用需要滿足兩個條件:索引是輔助索引,索引不是唯一的。