MySQL相关
自己看一些优秀博文总结的,也有部分是别人的总结,看得太多,忘记从什么地方看到的了(因为习惯先写在word文档上),有借鉴到的大神可以自己在评论补充原文链接呀,(抱拳~~)
InnoDB的特性
自适应哈希
InnoDB建立索引时,只可以建立B+tree索引,是不可以建立hash索引的,而hash索引相对于B+tree索引,虽然无法实现排序,范围检索的效果,但是在等值检索时比B+tree索引的效率高很多。
所以InnoDB在B+tree索引的基础上又添加了自适应hash索引,只不过这个索引无法通过手动创建,是通过InnoDB存储引擎在运行时自己创建的,对于用户来说是透明的,
InnoDB会监控堆表上二级索引的查找,如果发现某个二级索引频繁访问,那么就会认为这个二级索引是热点数据,就会针对这个二级索引建立hash索引,下一次再检索时就可以直接通过hash索引检索。
InnoDB认为最近连续三次被访问的二级索引是热点数据,就会自动创建hash索引。
缺点是:会占用一部分InnoDB的缓冲池,只适合等值查询,不支持范围查询;极端情况下才有效,如果不是连续读相同索引就无效。
插入缓存(insert buffer)
插入缓存是针对非聚簇索引而言的,因为聚簇索引一般都是有顺序的,所以在执行批量插入时,第一条语句插完之后后面的数据所在页基本上都和第一条数据在同一页上,或者相邻页,根据数据库预读的特性。
所以批量插入的时候只需加载依次页就可以完成多条数据的插入操作。但非聚簇索引基本上是无序的,离散的,所以每次插入的时候就需要离散地访问非聚簇索引页,就降低插入的性能。
InnoDB为解决这个问题就新增了插入缓存功能,对于非聚簇索引插入或更新,不是直接更新到索引页,而是先判断更新的非聚簇索引是否存在缓冲池中,如果在就直接插入到缓冲池,如果不存在就先放入缓冲池。然后再以一定的频率将缓冲池中的缓存和非聚簇索引页的数据进行合并操作。由于在一个索引页,所以通常可以将多个插入操作合并成一个操作,减少了非聚簇索引页的IO操作。
插入缓存的条件