MySQL--InnoDB关键特性

引言

        最近读了一下MySQL技术内幕-InnoDB存储引擎。这本书专攻InnoDB存储引擎,索引、锁、MVCC都讲的很详细,比较细节,而高性能MySQL它的范围就比较广,有点偏运维,可以先看MySQL技术内幕然后再读高性能MySQL。下面就大概先总结一些InnoDB引擎的关键特性,后续会总结一下索引,锁之类的内容。


插入缓冲(性能提升)

Insert Buffer

         Insert Buffer,对于非聚集索引的插入或更新操作,不是每一次都直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,如果在,就直接插入,如果不在,就先放入一个 Insert Buffer 对象中,而数据库以为非聚集的索引已经插入到叶子节点,实际并没有,只是放到另一个位置。以一定的频率和情况进行 Insert Buffer 和 辅助索引叶子节点的merge,通常多个插入能合并到一个操作中,因为放在了一个索引页中,这样就提高了对非聚集索引的插入性能。

        简单的说,减少了离散访问非聚集索引页的操作。但相对于时序数据来说,辅助索引的插入可能会比较顺序。

        Insert Buffer使用的时候需要同时满足下面两个条件:
        1.索引是辅助索引
        2.索引不是唯一索引

        假如说是主键索引(聚集索引 Primary Key),那么ID自增,本来就是顺序写入,速度是非常快的。对于唯一索引来说,每次插入都需要判断记录的唯一性,所以查找肯定会发生离散的读取情况,Insert Buffer就失去了意义。

Change Buffer

        从1.0.x版本开始,可以对DML操作- insert、delete、update都进行缓冲,对应的分别是 Insert Buffer、Delete Buffer、Purge Buffer。适用的范围都是一样的,依然针对的是非唯一的辅助索引

        对一条记录的update操作可能分为两个过程

        1.将记录标记为已删除(Delete Buffer)
        2.真正将记录删除(Purge Buffer)

        Insert Buffer 是B+树实现,4.1版本之前是每个表一棵 Insert Buffer B+树,之后是只维护了一颗全局B+树针对所有的表,默认放在ibdata1共享空间中。

Merge Insert Buffer

        前面介绍了这么多的优化,那么到底什么时候合并到辅助索引页呢?

        1.辅助索引页被读取到缓冲池中。

        2.Insert Buffer BitMap 追踪辅助索引页无可用空间时(这个BitMap就不做介绍了,可以自行百度这条规则)。

        3.Master Thread 固定时间段会执行一次merge操作。


doublewrite(两次写提高数据页可靠性)

数据库宕机时,可能一页数据还没写完。这种情况被称为部分写失效。

        双写机制就是针对这种情况的,在应用重做日志前,需要一个页的副本来还原该页,再进行重做,这就是doublewrite。
在这里插入图片描述
写入流程:
        为了解决写失效问题 ,当mysql将脏数据flush到data file的时候, 先使用memcopy 将脏数据复制到内存中的double write buffer ,之后通过double write buffer再分2次,每次写入1MB到共享表空间,然后马上调用fsync函数,同步到磁盘上,避免缓冲带来的问题,在这个过程中,doublewrite是顺序写,开销并不大,在完成doublewrite写入后,在将double write buffer写入各表空间文件,这时是离散写入。
如果发生了极端情况(断电),InnoDB再次启动后,发现了一个Page数据已经损坏,那么此时就可以从doublewrite buffer中进行数据恢复了。

恢复流程:
        如果是写入buffer成功,磁盘失败,就不通过日志计算,直接拿Buffer的数据刷一遍即可,否则都是通过日志先刷到double buffer 然后再同步到磁盘,主要还是为了数据页的可靠性。


自适应哈希索引(加快查询速度)

        哈希索引一般查找的时间复杂度是O(1),而B+数一般是3~4层,就需要3 ~4的查询。InnoDB存储引擎会监控表上各索引页的查询。如果可以通过建立哈希索引来提高查询效率,则建立哈希索引,称为自适应哈希索引(Adaptive Hash Index, AHI)。它是通过缓冲池的B+树页构建而来,因此建立速度很快。存储引擎会自动根据访问频率和模式来自动地为热点页建立哈希索引。

        构建的要求是对页的访问模式必须是一样的。例如对于(x,y)这个联合索引来说,假如有以下两个查询
        WHERE X= 1
        WHERE X= 1 AND Y = 1
访问模式一样指的是查询条件一样,也就是说交替上面两个条件,是不会进行构造自适应哈希索引的。固定条件访问100次或者访问了N次,N= 页中记录 * 16
SHOW ENGINE INNODB STATUS 命令可以看到当前 AHI 的使用状况。
在这里插入图片描述
需要注意的是只针对等值查询生效。


异步IO(合并多个I/O操作)

        为了提高磁盘的操作性能,数据库都采用异步IO (Asynchronous IO, AIO)的方式来处理磁盘操作,InnoDB也一样。
        与AIO相对应的是 Sync IO,每一次IO操作,都要等待当前操作结束后才能进行接下来的操作。

        AIO的另一个优势是可以进行IO Merge 的操作,比如说要访问的页是连续的3页(3*16KB),就可以合并成一次IO访问48KB的页,InnoDB 1.1.x开始,直接内核级别AIO的支持,称为Native AIO。需要libaio库的支持。磁盘的写入都是由AIO完成。


Flush Neighbor Page(刷新领接页)

        工作原理: 当刷新一个脏页时,会检测所在区的所有页,如果是脏页就都一起刷新,可以通过AIO将多个IO写入合并成一个IO写入,在机械磁盘上效果比较明显,建议开启。对于固态硬盘而言有着较高的IOPS性能的磁盘,建议关闭此特性。innodb_flush_neighbors = 0。


小结

        上面列举了一些InnoDB的关键特性,大概介绍了一下,并不是很深入。就我个人觉得还是Insert Buffer(减少随机访问IO)、doublewrite(保证数据页的可靠性)、 AIO (合并IO)重要一些,可以更深入的了解一下,比如Insert Buffer BitMap。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值