INNODB发动机的四大特点
1.插入缓存
2.写两遍。
3.自适应散列
4.预读一、插入缓存(insert buffer)
插入缓冲区/更改缓冲区:提高插入性能。变更缓冲区是插入缓冲区的增强,只对插入有效,变更缓冲区对插入、删除、更新(删除插入)和清除有效。
它只对插入和更新非聚集索引(非唯一)有效。每次插入都不写入索引页,而是先判断插入的非聚集索引页是否在缓冲池中,如果在,则插入字节;如果没有,先放入插入缓冲区,在按照一定的效率进行合并操作,在写会Disk.这通常会将多个插入合并到一个操作中,目的还是为了减少随机IO带来性能损耗。.
使用插入缓冲区的条件:
非聚集索引
非唯一索引
更改缓冲区作为缓冲池的一部分存在。Innodb_change_buffering参数缓存对应的操作:(更新将被视为删除插入)
Innodb_change_buffering:设置值为:插入、删除、范围、更改(插入和删除)、全部(默认)、无。
All:默认值,缓存插入、删除、清除操作。
插入:缓存插入操作。
Deletes:缓存删除操作。
更改:缓存插入和删除操作。
Purges:缓存后台心脏的物理删除操作。
它的使用范围可以通过参数来控制:
Innodb_change_buffer_max_size,默认为25%,即缓冲池的1/4,最多可以设置为1/2。当MySql实例中有大量修改操作时,考虑Innodb_change_buffer_max_size有多大。
以某一频率合并的条件是什么?
辅助索引页被读入缓存池,普通选择首先检查非聚集索引页是否存在于插入缓冲区中,如果存在,则合并并插入它。
辅助索引页没有可用空间。如果空间小于页面大小的1/32,将强制执行合并操作。
每秒和每10秒的主合并操作。
二、二次写(Double wite)
DoubleWrite缓存位于系统表空间的存储区域,用于在Innodb Buffer池中刷新后、写入数据文件前缓存Innodb的数据页。因此,当操作系统或数据库进程在将数据页写入磁盘的过程中崩溃时,Innodb可以在DoubleWrite缓存中找到数据页的备份,并使用它来执行崩溃恢复。将数据页写入双写缓存的操作所需的IO消耗,该数据页将被写入一个大的连续块中。
在应用重做日志之前,用户需要一份页面的副本。当写入失败时,页面的副本用于恢复页面未被重做,这就是双写。
双写的构成:
内存中双写缓冲区的大小是2M。
物理磁盘上的共享表空间中有128个连续页面,即2个扩展页面,大小与2M相同。
当缓冲池中的脏页被刷新时,脏页将被memcpy()函数照片打印到内存中的Double Write Buffer,然后被Double Write分成两次,每次1M被顺序写入共享表空间的物理磁盘。在这个项目中,由于Double Write页面是连续的,这个过程是按顺序写的,成本不大。双写页写入后,双写缓冲区中的页被写入每个表空间文件,此时的写入是离散的。如果操作系统在将页面写入磁盘的过程中崩溃,Innodb可以从共享表空间中的Double Write中找到页面的副本,将其复制到表空间文件中,然后应用重做日志。
三、自适应哈希索引(AHI)
Adaptive Hash索引属性使Innodb更像内存中的数据库,可以通过Innodb_adaptive_hash_index打开,也可以通过参数—— skip-Innodb _ Adaptive _ Hash _ index关闭。
注意:自适应哈希可以关闭。
生成哈希索引的条件很苛刻。
索引被访问过17次吗?
索引中的一个页面已经被访问了100次。
访问模式必须
须是一样的。
例如对于(a、p)访问模式情况:
where a = xxx
where a = xxx and b = xxx
Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问 ,二级索引成为 热数据,建立哈希索引可以代理速度的提升。
经常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。
哈希(Hash)是一种非常快的等值查找方法,一般情况下这种查找的时间复杂度为O(1) 即一般仅需要一次查找就能定位数据,而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般是3、4层,故需要3-4次的查询。
Innodb会监控对表上个索引页的查询,如果观察到简历哈希索引可以带来速度提升,则自动建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)
特点:
- 无序,没有树高
- 降低对二级索引树的频繁访问资源,索引树高=4 访问索引:访问树,根节点,叶子节点。
- 自适应
缺陷: - jash自适应索引会占用Innodb buffer pool
- 自适应hash索引只适合搜索等值的查询,如select * from table where index_col='xxx' 而对于其他查找类型,如范围查找,是不能使用的。
- 极端情况下,自适应hash索引才有比较大的意义,可以减低逻辑读。
四、预读
Innodb使用两种预读算法来提高I/O性能:线性预读(linear read_ahead)和随机预读(randomread-ahead)为了区分这两种预读的方式,我们可以吧线性预读放到以extent为单位,而随机读放到exent中的page为单位,线性预读着眼于降下一个extent提前读取到 buffer pool中,而随机预读着眼于extent中的剩余的page提前读取到buffer pool中。
原文为:https://www.cnblogs.com/zhs0/p/10528520.html
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/117966.html