Innodb的四个特性
在介绍Innodb预读特性之前,笔者有必要介绍一下 *** 作系统的局部性原理,这样方便于读者理解Innodb的一个强大特性-----预读。
局部性原理
一个优秀额程序通常会有良好的局部性,所谓局部性指的是一个应用程序通常会重复使用某块内存区域中的数据,或者使用该区域邻近内存区域的数据。默认情况下当 *** 作系统监测到某块内存区的数据将要被重复使用或者邻近的数据将要被使用时, *** 作系统会一次性将相邻的若干个数据块同时加载到内存缓冲区中。局部性原理分为以下两种:
有了以上局部性原理的知识基础之后,我们再来理解预读的原理就相对简单多了。可以简单的理解为:当Innodb监测到某一块磁盘空间的数据将要被读取时邻近的数据很快将要被使用,Innodb会一次性仅通过一次IO *** 作将数据读取到内存缓冲池中。Innodb中预读包含两种模式:
何时触发Innodb预读功能可以通过如下配置来控制
双写缓冲区:双写缓冲是一种特殊的文件刷新技术,它涉及到一种称为双写缓冲区的数据结构。在默认情况下Innodb默认开启该功能(dubblewrite_buffer=ON),他增加意外退出和断电后的数据恢复的安全性,并减少文件同步(fsync()) *** 作来提高数据库的性能。
在将页面写入数据文件之前, InnoDB 首先将它们写入称为双写缓冲区的连续表空间区域。只有在对双写缓冲区的写入和刷新完成后,才会 InnoDB 将页面写入数据文件中的适当位置。如果在页面写入过程中存在 *** 作系统、存储子系统或意外 的 mysqld 进程退出(导致 页面撕裂 的 情况), InnoDB 则可以稍后在恢复期间从双写缓冲区中找到该页面的良好副本。
双写缓冲的实现过程 : 对缓冲池的脏页进行刷新时,不是直接写磁盘,而是会通过memcpy()函数将脏页先复制到内存中的doublewrite buffer,之后通过doublewrite 再分两次,每次1M顺序地写入共享表空间的物理磁盘上,在这个过程中,因为doublewrite页是连续的,因此这个过程是顺序写的,开销并不是很大。在完成doublewrite页的写入后,再将doublewrite buffer 中的页写入各个 表空间文件中,此时的写入则是离散的。如果 *** 作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,innodb可以从共享表空间中的doublewrite中找到该页的一个副本,将其复制到表空间文件,再应用重做日志。
注意:将数据页写如文件的时候,Innodb会将数据写入redo log日志文件中,当完全写入redo log文件之后会设置一个prepare状态,然后再将数据写入dubbo write buffer中,当意外突出或者断电,数据库恢复数据时会先检查redo log日志文件中是否有prepare状态,如果有直接使用dubble write buffer恢复数据,如果dubble write buffer不可用则使用redo log文件恢复数据,这种方式称为二阶段提交方式。
数据写顺序:redo log --->dubble write buffer - 通用表空间---->指定表空间
innodb使用insert buffer"欺骗"数据库:对于为非唯一索引,辅助索引的修改 *** 作并非实时更新索引的叶子页,而是把若干对同一页面的更新缓存起来做合并为一次性更新 *** 作,转化随机IO 为顺序IO,这样可以避免随机IO带来性能损耗,提高数据库的写性能。
插入缓冲的配置
当缓冲池中的某个数据(17次)或者某个页(100次)经常被访问,达到一定频率的时候,Innodb会根据缓冲池中的数据自动构建一个hash索引,提高数据的访问速度,该索引称为自适应哈希索引。
Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升
经常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。
哈希(hash)是一种非常快的等值查找方法 ,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般3-4层,故需要3-4次的查询
篇尾寄语:
技术赋能于业务,希望本篇文章让每一位读者有所收益...................................................
如有不当的地方请多多计较,共同学习,共同进步,fighting............................................
祝所有编程爱好者,求职,加薪,迎娶白富美,走向人生巅峰........................................
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)