索引是物理数据页存储,在数据文件中(InnoDB,ibd文件),利用数据页(page)存储。 索引能够加快检索速度,可是同时也会下降增删改操做速度,索引维护须要代价。
索引涉及的理论知识:二分查找法、Hash和B+Tree。算法
二分查找法也叫做折半查找法,它是在有序数组中查找指定数据的搜索算法。数据库
优势是等值查询、范围查询性能优秀 缺点是更新数据、新增数据、删除数据维护成本高。
(left+right)/2
public static int binarySearch(int key, int... array) { int low = 0; int high = array.length - 1; while (low <= high) { int mid = low + (high - low) / 2; if (key < array[mid]) { high = mid - 1; } else if (key > array[mid]) { low = mid + 1; } else { return mid; } } return -1; }
Hash底层实现是由Hash表来实现的,是根据键值 <key,value> 存储数据的结构。
很是适合根据key查找value值,也就是单个key查询,或者说等值查询。数组
Hash索引能够方便的提供等值查询,可是对于范围查询就须要全表扫描了。性能
Hash索引在MySQL中Hash结构主要应用在Memory(存储引擎 基于内存 不多用)原生的Hash索引 、InnoDB 自适应哈希索引。优化
InnoDB自适应哈希索引是为了提高查询效率,InnoDB存储引擎会监控表上各个索引页的查询,当InnoDB注意到某些索引值访问很是频繁时,会在内存中基于B+Tree索引再建立一个哈希索引,使得内存中的 B+Tree 索引具有哈希索引的功能,即可以快速定值访问频繁访问的索引页。spa
InnoDB自适应哈希索引:在使用Hash索引访问时,一次性查找就能定位数据,等值查询效率要优于B+Tree。指针
自适应哈希索引的创建使得InnoDB存储引擎能自动根据索引页访问的频率和模式自动地为某些热点页创建哈希索引来加速访问。
另外InnoDB自适应哈希索引的功能,用户只能选择开启或关闭功能,没法进行人工干涉。code
show engine innodb status \G; show variables like '%innodb_adaptive%';
MySQL数据库索引采用的是B+Tree结构,在B-Tree结构上作了优化改造blog
B-Tree结构索引
B树的搜索:从根节点开始,对节点内的索引值序列采用二分法查找,若是命中就结束查找。没有命中会进入子节点重复查找过程,直到所对应的的节点指针为空,或已是叶子节点了才结束。
B+Tree结构
相比B树,B+树进行范围查找时,只须要查找定位两个节点的索引值,而后利用叶子节点的指针进行遍历便可。而B树须要遍历范围内全部的节点和数据,显然B+Tree效率高。
聚簇索引和非聚簇索引:B+Tree的叶子节点存放主键索引值和行记录就属于聚簇索引;若是索引值和行记录分开存放就属于非聚簇索引。
主键索引和辅助索引:B+Tree的叶子节点存放的是主键字段值就属于主键索引;若是存放的是非主键值就属于辅助索引(二级索引)。
在InnoDB引擎中,主键索引采用的就是聚簇索引结构存储。
聚簇索引(汇集索引)
聚簇索引是一种数据存储方式,InnoDB的聚簇索引就是按照主键顺序构建 B+Tree结构。B+Tree的叶子节点就是行记录,行记录和主键值紧凑地存储在一块儿。 这也意味着 InnoDB 的主键索引就是数据表自己,它按主键顺序存放了整张表的数据,占用的空间就是整个表数据量的大小。一般说的主键索引就是汇集索引。
辅助索引
InnoDB辅助索引,也叫做二级索引,是根据索引列构建 B+Tree结构。但在 B+Tree 的叶子节点中只存了索引列和主键的信息。二级索引占用的空间会比聚簇索引小不少, 一般建立辅助索引就是为了提高查询效率。一个表InnoDB只能建立一个聚簇索引,但能够建立多个辅助索引。
非聚簇索引
与InnoDB表存储不一样,MyISAM数据表的索引文件和数据文件是分开的,被称为非聚簇索引结构。