mysql的查询的过程是从文件中提取到内存中查询,MySQL启动时会在内存中维护一个buffer pool缓冲区,操作数据之前要从磁盘将数据加载到缓冲区,为了减小IO次数MySQL与磁盘的IO单位page是16KB.将这些page组织成一个查询高效的数据结构,这个数据结构就是索引
MySQL索引结构是B+树,索引按照存储引擎分为innodb的聚簇索引和非聚簇索引.按照搜索关键字分为主键索引和普通索引.
B树也叫平衡多路查找树,M阶B树叫做M叉树
1.节点中可以存储多个值(索引),并且从小到大排列.
2.节点即存储键值又存储数据
3.根节点的节点数有[2,M]个子节点
4.除根节点以外的非叶子节点个数为值的个数-1,最大超过M-1.
5.叶子节点都位于同一层.
B+树是在B树的基础上衍生出来的.
1.根节点可能是叶子节点,也可能是子节点[2,M]的树
2,索引节点有K个值,就有K+1个分支几点.
3.所有叶子节点用指针链接,并从小到大排列.
4.非叶子节点只存储key值,不存储数据,只有叶子节点存储数据.
5.有两个头结点,一个根节点,一个最小的叶子节点.
1.表是存储在磁盘中的,要操作表中的数据需要从磁盘提取数据到内存.B+树只有叶子节点存储数据,其他节点只存储key值,所以树的高度相对较低,搜索路径较短,IO次数少.而B树的内部节点存储的是键值对,树的高度相对较高,IO次数多.io开销大,因为磁盘到内存的传输速度慢,数据定位会有寻道时间和旋转延迟.
2.B+树的所有叶子节是一个链表,并且有序,范围查询遍历链表即可,而B树每查询一个都需要从根节点重新遍历查询,范围查询效率低.
innodb存储引擎和myisam存储引擎使用的都是B+树索引结构,但是innodb是将数据存储在叶子节点,而myisam是将索引结构和数据分开存储的,索引叶子节点存储的是数据记录的地址。 像innodb这样的索引结构称为将聚簇索引,myisam这样的称为非聚簇索引
除了主键索引,允许添加其他非主键索引,聚簇索引的非主键索引的叶子结点是存储的主键,利用非主键索引找到主键,再利用主键找到整条数据,非聚簇索引的非主键索引则跟主键索引相同,叶子结点都是存储的数据记录的地址.
创建主键索引
创建唯一键索引
创建其他普通索引
创建复合主键索引
复合主键索引是多列组合成的主键,查询时,用复合建最左边列的值查找复合建右边的值,从主键的左往后右一次匹配能匹配上,就能直接返回,这加索引覆盖.