MySQL读书笔记--InnoDB特性

1.插入缓存(Insert buffer)---提高性能

     对于非聚簇索引和非唯一索引(数据库不检查唯一性)。InnoDB对于辅助索引的插入,会先判断索引是否在缓存池中,如果在,直接插入,如果不在,先缓冲在Insert buffer中,然后再以一定的频率合并到辅助索引叶子节点中。

    这样做的原因是,对于非辅助索引,插入并非有序(顺序插入快),对于并发插入或更新的操作而言,会严重影响性能。通过插入缓冲,可以将多次IO操作合并成一次IO操作,以减少对磁盘的操作。提供性能。

   缺点:再密集写情况下,会占有大量缓存资源

2.两次写(Double Write) ---提高可靠性

   doublewrite 由两个部分组成, 一是内存中 doublewrite buffer,大小为2MB,另一个是物理磁盘上共享表空间中连续的128个页。大小同样为2MB。
    在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过memcpy 函数将脏页先复制到内存的doublewrite buffer,之后通过doublewrite buffer 再分两次,每次1M顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘。

    如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,InnoDB存储引擎额可从共享表空间的double write 中找到该页的一个副本。将其复制到表空间文件,再应用重做日志

   这样做的原因是:虽然重做日志可以进行恢复操作,但是如果重做日志发生损坏,那么重做日志的恢复就没有意义了。这时,可以在共享表空间中找到一个副本恢复。从而提高可靠性。

3.自适应哈希索引(Adaptive Hash Index)

     自适应哈希索引是(AHI)通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引,InnoDB引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。
    AHI有一个要求,即对这个页的连续访问模式是一样的。
             (1)where a=xx
             (2)where a=xx and b=xxx
    访问模式一样指的是查询的条件一样,如果上面交替访问,是不会构建AHI的

    同时还有如下要求:
             (1)以该模式访问了100次
             (2)页通过该模式访问了N次,其中N=页中的记录*1/16

     这样做的原因:首先自适应哈希索引的底层实现是B+树,而B+树高度一般在2-4层,所以对于一次查询最多2-4 I/O

4.异步IO(Async IO)
    用户发出一条索引扫描的查询,那么这条SQL查询语句可能需要扫描多个索引页,页就需要进行多次的IO操作,每次扫描一个页并等待其完成然后再进行下一次扫描。这样很没必要。用户可以在发出一个IO请求后立即再发生出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,这就是AIO

    AIO的另一个优势是可用进行IO Merge 操作,也就是多个IO合并为一个IO
    例如需要访问的页(space, page_no):
    (8,6),(8,7),(8.8)
    每个页大小为16K,那么同步IO需要进行3次IO操作,而AIO会判断到这三个页是连续的,因此AIO底层会发送一个IO请求,从   (8,6)开始,读取48K


5.刷新邻接表
    当刷新一个脏页时,InnoDB引擎会检查该页所在区的所有页,如果是脏页,一起刷新(减小I/O次数)

InnoDB新特性

猜你喜欢

转载自blog.csdn.net/H_L_S/article/details/88755796
今日推荐