聚簇索引
在InnoDB中,数据本身是通过的B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造的一颗B+Tree。同时叶子节点的中存放的就是整张的表的行记录数据,也将聚簇索引的叶子节点称为数据页,这个节点中的索引组织表的数据的也是索引的一部分。
一般情况下会使用的自增主键作为聚簇索引,没有的话MYSQL会自行创建主键,但是其代价是巨大的。
辅助聚簇(非聚簇索引)
在聚簇索引之上创建的索引称为辅助索引。辅助索引访问数据是需要进行二次探查的,辅助索引叶子节点的存储不是的行的物理地址而是主键值。通过辅助索引的首先找到的是主键值,再通过主键值找到数据行的物理页。再通过的数据页中的page directory找到数据行。
InnoDB辅助索引节点的并不包含行记录的索引数据,节点除了包含键值外还包含含数据的聚簇索引。
InnoDB的四大特性:
1. insert/change buffer
插入缓冲区之前的版本称之为的insert buffer 现在称之为的change buffer,主要提升的是性能,而insert buffer只对inseert 命令行有效,change buffer只对insert 、update、delete以及purge有效。
只对于非聚集索引的插入和更新有效,对于每次的插入和更新的并不是写到索引页中的,而是判断插入的非聚集索引页是否在的缓冲池中。如果在缓冲池中则直接插入,若不在那么就直接放入插入缓冲区中的,按照一定的频率进行的合并操作的,再写回到的disk中,目的是减少的随机IO到来的性能的提升。
其实用的条件:
- 非聚集索引
- 非唯一索引
2. 两次写
其中的insert表示的是性能上的提升,两次写带来的是数据的性能可靠性的提升。其中两次写主要由两部分组成,一部分是内存中两次写的缓冲区。另一部分的是磁盘上共享表空间中的中连续的128页,其大小都是尺度为2M的空间。对缓冲区数据脏页进行刷新时,并不直接写到磁盘中,首先将脏页中的数据添加到的内存中的两次写的内存缓冲区中,之后分两次的每次1M的添加到的共享的磁盘表空间中,之后调用fsync函数同步磁盘中的数据。
3. 自适应哈希索引
哈希算法查找的时间复杂度的为O(1),而利用的B+数的查找次序为3-4层,故需要查询的次数为3-4次查询数据。
InnoDB存储引擎会建立会监控的对表上各种索引的查询的,如果观察到哈希索引带来的速度的提升,则建立的哈希索引结构。自称为的自适应哈希的索引。
4. 预读
预读操作是一种IO操作,用于异步将磁盘的中的数据的读取到buffer pool中,预料中的数据页会被马上读到,预读请求中的所有页会被添加到的一个的范围之内。InnoDB共有两个的预读算法。
线性预读技术:在buffer pool中被访问到的数据的他临近的页会被的很快的访问到。能够通过的调整连续访问的页的数量来控住InnoDB中的预读操作,使用参数InnoDB_read_ahead_threshold配置,添加这个参数前,InnoDB会读取的当前区段的最后一页才开始进行预读。
随机预读:通过buffer pool存中的预测哪些页很快被访问,而不考虑这些页的读取顺序,如果发泄的buffer pool中存在的一个区段的13个连续的页,如果的innoDB会异步发起预读的请求占据的这个页。