JavaShuo
欄目
標籤
MySQL InnoDB小結
時間 2019-11-14
標籤
mysql
innodb
小結
欄目
MySQL
简体版
原文
原文鏈接
前陣子一直在作與Mysql相關的項目,因而也一直在學習Mysql相關的知識,看了《Mysql:Innodb存儲引擎》、《高性能Mysql》後,也算對Mysql有必定的瞭解了,特意在此總結一下(圖片都是《Mysql:Innodb存儲引擎》電子版的)。
mysql體系結構:
由:鏈接池組件、管理服務和工具組件、sql接口組件、查詢分析器組件、優化器組件、
緩衝組件、插件式存儲引擎、物理文件組成。
mysql是獨有的插件式體系結構,各個存儲引擎有本身的特色。
mysql各個存儲引擎概述:
innodb存儲引擎
:[/color][/b] 面向oltp(online transaction processing)、行鎖、支持外鍵、非鎖定讀、默認採用repeaable級別(可重複讀)經過next-keylocking策略避免幻讀、插入緩衝、二次寫、自適應哈希索引、預讀
myisam存儲引擎:
不支持事務、表鎖、全文索引、適合olap(在線分析處理),其中myd:放數據文件,myi:放索引文件
ndb存儲引擎:
集羣存儲引擎,share nothing,可提升可用性
memory存儲引擎:
數據存放在內存中,表鎖,併發性能差,默認使用哈希索引
archive存儲引擎:
只支持insert和select zlib算法壓縮1:10,適合存儲歸檔數據如日誌等、行鎖
maria存儲引擎:
目的取代myisam、緩存數據和索引、行鎖、mvcc
innodb特性:
主體系結構:
默認7個後臺線程,4個io thread(insert buffer、log、read、write),1個master thread(優先級最高),1個鎖(lock)監控線程,1個錯誤監控線程。能夠經過show engine innodb status來查看。新版本已對默認的read thread和write thread分別增大到4個,可經過show variables like 'innodb_io_thread%'查看。
存儲引擎組成:
緩衝池(buffer pool)、重作日誌緩衝池(redo log buffer)以及額外的內存池(additional memory pool).具體配置可由show variables like 'innodb_buffer_pool_size'、show variables like
'innodb_log_buffer_size'、show variables like 'innodb_additional_mem_pool_size'來查看。
緩衝池:
佔最大塊內存,用來存放各類數據的緩存包括有索引頁、數據頁、undo頁、插入緩衝、自適應哈希索引、innodb存儲的鎖信息、數據字典信息等。工做方式老是將數據庫文件按頁(每頁16k)讀取到緩衝池,而後按最近最少使用(lru)的算法來保留在緩衝池中的緩存數據。若是數據庫文件須要修改,老是首先修改在緩存池中的頁(發生修改後即爲髒頁),而後再按照必定的頻率將緩衝池的髒頁刷新到文件。經過命令show engine innodb status;來查看。
日誌緩衝:
將重作日誌信息先放入這個緩衝區,而後按必定頻率將其刷新到重作日誌文件。
master thread:
loop主循環每秒一次的操做:
日誌緩衝刷新到磁盤,即便這個事務尚未提交。(老是執行,因此再大的事務commit
的時間也是很快的)
合併插入緩衝(innodb當前一秒發生的io次數小於5次則執行)
至多刷新100個innodb的緩衝池中的髒頁到磁盤(超過配置的髒頁所佔緩衝池比例則執
行,在配置文件中由innodb_max_dirty_pages_pac決定,默認是90,新版本是75,
google建議是80)
若是當前沒用用戶活動,切換到backgroud loop
loop主循環每10秒一次的操做:
刷新100個髒頁到磁盤(過去10秒IO操做小於200次則執行)
合併至多5個插入緩衝(老是)
將日誌緩衝到磁盤(老是)
刪除無用的Undo頁(老是)
刷新100個或者10個髒頁到磁盤(有超過70%的髒頁,刷新100個髒頁;不然刷新10個髒頁)
產生一個檢查點
backgroud loop,若當前沒有用戶活動(數據庫空閒時)或者數據庫關閉時,就會切換到這個循環:
刪除無用的Undo頁(老是)
合併20個插入緩衝(老是)