1.插入缓冲
适用对象
- 非唯一索引
- 非聚集索引
为什么要有这个特性,或者说这个特性解决了什么问题
Innodb数据表本身就是一个聚集索引表,表中的记录按照聚集索引顺序存储,插入时按聚集索引自增插入,顺序写磁盘,速度是有保证的;
但对于非聚集索引,插入操作就不那么顺利了,非聚集索引并非按顺序插入,因此在插入非聚集索引叶节点时,为随机插入,性能不高;
聚集索引:
索引的顺序与实际的顺序相同
比如根据拼音查字典
非聚集索引
索引的顺序与实际的顺序不同
比如根据部首查字典
具体操作
如果索引页在缓冲池中,则直接插入
如果不在,则先放入一个插入缓冲区中,返回插入成功的结果。
master thread会定时讲插入缓冲区中的数据插入数据库
此举将多个插入合并到一个IO操作中,从而提高了性能
2.两次写
先了解:部分写失效
当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,就是部分写失效。
为什么要有这个特性,或者说这个特性解决了什么问题
部分写失效会导致数据丢失。是无法通过重做日志恢复的,因为重做日志记录的是对页的物理修改,如果页本身已经损坏,重做日志也无能为力。
具体操作
- 先将数据写入缓冲区
- 分两次将缓冲区的数据写入磁盘共享表空间,每次写入1MB
- 讲缓冲区的数据写入数据文件
假如宕机 - 将共享表空间的的页覆盖原有数据页
- 再应用重做日志
两次写性能开销只在第二步
由于磁盘共享表空间是连续的,因此开销不是很大
可通过skip_innodb_doublewrite属性禁用,默认开启
3.自适应哈希
InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引
InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。