InnoDB关键特性包括:
插入缓冲,两次写,自适应哈希索引
插入缓冲:
最令人激动的关键特性。Insert Buffer不仅在缓冲池中,同时也和数据页一样,是物理页的一个组成部分。
例如一张表,id为自增主键,name为non unique的key。插入时,数据也根据id无需随机IO,而name这种非聚集的非唯一索引,则需要离散的访问非聚集索引页,插入性能降低。这是B+树的特性所决定的必然结果--非聚集索引插入的离散型。
插入缓冲则被开创性地用于解决这个问题:对于非聚集索引的插入或更新,并不是每次直接插入索引页,先判断这个索引页是否在缓冲池,若在,则直接插入,若不在,则先放入插入缓冲,再以一定频率执行插入缓冲和非聚集索引页子节点的合并操作(merge),大大提升性能。
插入缓冲的必备条件:non unique+non primary的key
两次写:避免部分写失效(partial page write),有些文件系统本身就提供了写失效防范机制如ZFS,就不需要double write了。
提高可靠性。写失效:正在写一个页16K,只写了4K,宕机。可以用redo log恢复,但是redo log记录的是对页的物理操作,如偏移量222,写‘aaa’。如果这个页本身已损坏,则重做是没有意义的。所以需要一个页的副本,当写入失效时,用这个副本来还原,然后才应用redo log。
流程:脏页--memcpy--》double write buffer-->写入共享表空间--》fsync同步,然后double write buffer 才开始刷新到磁盘。
自适应哈希索引:
mysql的Heap存储引擎默认使用hash索引。innodb提供了另一种实现方法。
InnoDB会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以是自适应的。
InnoDB会自动根据访问的频率和模式来为某些页建立哈希索引。
哈希索引只能用来搜索等值的查询,不能适用范围查询等。
InnoDB plugin=新版本的innoDB存储引擎。