写在前
本篇博客承接上一篇 mysql 默认引擎innodb 初探(一)进行对mysql数据库 innodb存储引擎进行探索
mysql默认存储引擎 innodb简介
Innodb是第一个完整支持ACID事务的mysql存储引擎(BDB是第一个支持事务的mysql存储引擎,目前已经停止开发);
主要特点是 支持行锁,MVCC,事务,外键及一致性非锁读,可以有效利用CPU和内存;
各版本对比如下:
tips : 如果不支持多回滚段,Innodb最大支持并发事务量被限制为1023
innodb体系架构
innodb存储引擎主要有一些后台线程和相应内存(缓冲池,重做日志缓冲,额外缓冲池)组成;
tips : 由于innodb存储引擎是基于磁盘存储的,由于CPU速度和磁盘速度存在巨大差距,因此基于磁盘的数据库通常都会使用缓冲池技术提高数据库的整体性能;
后台线程
后台线程:
master thread : 将缓冲池数据异步刷新到磁盘,保障数据一致性,包括刷新日志到磁盘,脏页刷新,合并插入缓冲,undo页回收等
IO thread :
innodb大量使用AIO(async IO)来提高数据库的性能
innodb有4个IO线程,read thread, write thread, log io thread, insert buffer thread
可以通过 show variables like "innodb_%io_threads"\G 查看读写线程数
可以使用 show engine innodb status\G 查看innodb存储引擎状态
可以通过 innodb_read_io_threads or innodb_write_io_threads配置read & write IO线程数(innodb 1.0x)
purge thread :
事务提交后,其所使用的undolog就不再需要,所以需要存储引擎负责回收并分配新undo页;
innodb1.1x之前 purge动作在master thread中完成;
之后可以通过配置 innodb_purge_threads=1 开启独立的purge thread来处理,以减轻master thread负担,提高CPU使用率;
page cleaner thread :
innodb1.2x版本开始,将脏页刷新操作放在单独的page cleaner thread中,进一步减轻了master thread负担,并减轻用户查询线程的阻塞;
缓冲池
缓冲池:
缓冲池本质上就是一块内存区域,通过内存的速度弥补磁盘速度较慢对数据库性能的影响;
在数据库中进行读取操作时,首先判断待读取页是否存在缓冲池中;
如果存在,则缓冲池命中,直接从缓冲池中读取进行后续操作;
否则进行io操作,从磁盘中读取页,然后存放在缓冲池中(这个过程称 将页fix到缓冲池);
当数据库进行修改操作(insert update delete)时,则首先修改缓冲池中对应的页,然后再以一定频率刷新到磁盘上;
(注意:缓冲池中是页并不是每次都刷新,而是通过checkpoint技术按一定频率刷盘,下面会详细介绍checkpoint技术)
所以缓冲池的大小直接影响数据库的性能;
可以通过 show variables like "innodb_buffer_pool_size"\G 查看缓冲池大小
具体缓冲池包括索引页,数据页,undo页,插入缓冲,自适应哈希索引等(MySIAM只会缓存索引页,可看上面的介绍)
从innodb1.0x开始,运行设置多个缓冲池实例;每个页根据哈希值平均分配到不同缓冲池实例中;
从而减少数据库内部资源的竞争,增加并发处理能力;
可以通过 innodb_buffer_pool_instances配置缓冲池实例个数;
可以通过 show variables like “innodb_buffer_pool_instances” 查看缓冲池实例配置;innodb存储引擎通过LRU(lastest Recent Used),最少使用算法对内存进行管理,详情见附录A
重做日志缓冲
重做日志记录了innodb的事务信息,当数据库宕机或者出现其他意外情况;可以还原数据到某个时间点,从而保证数据的一致性和事务的持久性;
以下情况下会将重做日志缓冲刷到磁盘上:
master thread 每秒刷盘一次
事务提交时,强制刷盘
重做日志缓冲池剩余空间小于1/2时,刷新到磁盘
所以重做日志缓冲不需要太大,只要保证一秒的事务量即可,一般设置为8M;
可以通过 show variables like "innodb_log_buffer_size" 查看;
可以在配置文件中,通过设置innodb_log_buffer_size 配置重做日志缓冲大小;
额外缓冲池
一些数据结构本身内存分配,缓冲相关对象(缓冲控制对象),等待等信息会直接从额外缓冲池中进行申请;
当缓冲池配置很大时,也要适当增加额外缓冲池的配置;
checkpoint 介绍
执行DML语句(update,delete)修改页时,