算法
哈希表是一种常见的数据结构,即经过哈希算法计算出一个数字在表中的位置,并将数字存入该表。哈希索引就是经过哈希表来实现的,通常状况下查找时间复杂度为O(1)。InnoDB会监控对表上各索引页的查询,会自动根据访问的频率和模式为某些热点页创建哈希索引,因此又叫自适应哈希索引,访问模式同样指查询的条件同样。数据库
好比咱们维护一张身份证信息和用户姓名的表,须要根据身份证号查询姓名,哈希索引大概是这样的:数组
哈希索引适合只有等值查询的场景,例如select * from T where index_col = '##'。哈希索引是无序的,若是须要区间查询,那就要把全部数据扫描一遍。数据结构
有序数组在等值查询和区间查询场景中效率都很高,一样用上面的表举例,索引大概是这样的:spa
要查询某条数据或者区间的时候,使用二分法时间复杂度为O(logN)。但若是须要在中间更新数据时,那么就要移动后面全部的数据。有序数组索引只适用于静态存储引擎,好比保存2019年度学校全部学生信息。设计
B+树是为磁盘或其余直接存取辅助设备设计的一种平衡查找树。下面是一颗高度为2的B+树,全部记录都在叶子结点上顺序存放,叶子结点经过指针相连。3d
B+树索引就是B+树在数据库中的实现,因为B+索引在数据库中具备高扇出性,在数据库中B+树的高度通常为2~4层。查找某一键值的行记录时最多只须要2~4次IO。以InnoDB的一个整数字段索引为例,这颗B+树大概是1200叉树,这里N叉树的N取决于数据块的大小。高度为4的时候就能够存1200的3次方个值,大概为17亿。考虑到树根的数据块老是在内存中,一个10亿行的表上一个整数字段的索引,查找一个值最多只须要访问3次磁盘。指针
在InnoDB存储引擎中,表是根据主键顺序存放的。根据叶子结点内容,B+树索引又分为聚簇索引和辅助索引。code
咱们用一个例子来讲明上面的概念,建立一张表,在字段k上有索引:blog
create table T( id int primary key, k int not null, name varchar(16), index (k))engine=InnoDB;
表中R1~R5的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6),两颗B+树以下,能够明显看到这两个颗树的区别。