对于非聚集索引的插入或者更新,不是每一次都直接插入到索引页中,而且先判断插入的非聚集索引页是否在缓存池中。若在,则直接插入;若不在,则先放入到一个Insert Buffer对象中去。数据库这个非聚集的索引已经插入到叶子节点了,而实际上没有,只是存放到了一个位置,然后以一定的频率和情况刷新进行Insert Buffer和辅助索引叶子节点的merge操作。这时通常能将多个插入操作合并到一个操作中(因为在一个索引页中),这就大大的提高了对于非聚集索引插入的性能。
用Insert Buffer的使用需要同时满足以下两个条件
当满足以上两个条件的时,InnoDB存储引擎会使用Insert Buffer,这样就能提高插入操作的性能了。
不过考虑这样的情况。应用程序进行大量的插入操作,这些都涉及到了不唯一的非聚集索引,也就是使用了Insert Buffer,若此时MySQL数据库发生了宕机,这时势必有大量的Insert Buffer 并没有合到实际的非聚集索引中去。因此此时恢复可能需要很长的时间,在极端情况下甚至需要好几个小时。
Master Thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER)、UNDO页的回收等。
在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。而IO Thread的工作主要是负责这些IO请求的回调(call back)处理。InnoDB 1.0版本之前共有4个IO Thread,分别是write、read、insert buffer和log IO thread。在Linux平台下,IO Thread的数量不能进行调整,但是在Windows平台下可以通过参数innodb_file_io_threads来增大IO Thread。从InnoDB 1.0.x版本开始,read thread和write thread分别增大到了4个,并且不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threads和innodb_write_io_threads参数进行设置
事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页。
Page Cleaner Thread是在InnoDB 1.2.x版本中引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。而其目的是为了减轻原MasterThread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。