一、什么是索引?
索引无非就是能提高查询速度,快速检索的数据结构;MySQL里的索引是B+tree的数据结构构建的。
聊到B+tree,就要扯扯MySQL为什么采用B+tree这种数据结构作为索引了

二、为什么使用MySQL使用B+tree作为索引的结构?
1、使用二叉树作为索引结构
二叉树(非平衡)这种结构在极端条件下会退化成链表,遍历链表的时间复杂度是O(n),并没有提升查询的性能;
2、使用红黑树作为索引结构
红黑树虽然有自动进行树节点的二叉平衡功能。虽然相对于二叉树而言,不会有太严重的单边偏移情况,但还是避免不了极端情况下树的重心出现偏移的现象。(数据量变大的情况下,深度会变大)
使用红黑树数据结构容易在极端的情况下发生红黑树失重情况,如下图所示,随着数据量的增大,失重情况愈发严重;
3、hash索引
hash是一种散列的结构,数据存储是无序的,也就满足不了范围查询的需求。
4、使用Btree作为索引的结构
Btree和B+tree这两种结构十分相似,不同点就在于Btree的每个TreeNode存储的是data+index(索引字段的value)+left/right(指向子树的指针,并非只有两个子节点,B+tree是N叉树),而B+tree非叶子节点存储的是index+left/right即B+tree的每个非叶子节点比Btree的每个节点多出来的空间可以拿来存储索引,一个TreeNode应该尽可能的存储多一点的索引字段值,因为每个节点作为一个磁盘块能存储的容量是一样的,B+tree的索引树的高度自然就低一点,在B+tree结构中读取一个page就能查询得到,在Btree中可能需要两次或者更多,读取一个page记作一次IO,B+tree发生磁盘IO的次数比Btree的少,性能也就比Btre高。

三、Myisam非聚簇索引
1、主键索引
主键索引也就是根据主键值构建的索引树,叶子节点存储的表中的每行数据,这就是为什么我们建表的时候要标注主键,没有主键,表中的数据以文件的形式存储在硬盘上就像一盘散沙。
2、单列索引
单列索引是指除了主键外,根据某一字段构建的索引树,说到单列索引不得不提到一个回表查询
例如除了主键id之外,创建了字段grade索引
那么以grade构建的索引树的非叶子节点存储的就是表中grade字段的值,但是叶子节点存储的是主键id值,也就意味着,查到叶子节点之后,需要再一次遍历主键索引树,查询需要的完整数据
图片说明
3、复合索引
顾名思义,复合索引就是一次使用多个字段构建的索引
例如一个联合索引里面用到了id,职位名称,出生日期三个字段,那么在存储的时候会将三个字段一起存入节点里面的key位置
图片说明
4、索引覆盖
只需在一颗索引树上就可以查询到需要查询的数据,不涉及回表查询
例如创建了id、grade、gender复合索引,sql语句为select id,grade,gender from student where id= xx and grade = xx and gender = xx这就是索引覆盖,因为我需要遍历这一颗复合索引树就可以拿到想要的数据,但是sql语句为select id,grade,gender,name from student where id= xx grade = xx and gender = xx 这就需要回表查询,因为我这颗复合索引树里面数据仅仅包含id、grade、gender三个字段的值

(未完待续。。。有错请指正)