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个插入缓冲(老是)