MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引

MySQL的几种索引结构

https://www.cs.usfca.edu/~galles/visualization/BST.html 数据结构的一个学习网站

传送门:
MySQL进阶【一】—— 一条SQL是如何执行的 https://blog.csdn.net/shehuinidaye/article/details/108690037
MySQL进阶【三】—— Explain详解与实战https://blog.csdn.net/shehuinidaye/article/details/108692631
MySQL进阶【四】—— MySQL索引优化实战https://blog.csdn.net/shehuinidaye/article/details/108782534

B树

  • B树在MySQL的结构
    MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引_第1张图片

1、叶子节点具有相同的深度,叶子阶段的指针都为空
2、叶子节点和跟节点,均挂有数据块(因所有节点都挂有数据块,大大降低了索引树存储索引的数量)
3、所有索引不重复
4、节点从左到右是递增的

Hash

MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引_第2张图片

1、数组+链表的实现方式(与Java中的hashmap类似)
2、对索引key进行一次hash运算就可以定位到数据的存储位置
3、查询性能搞,但不支持范围查询,只能满足 等值查询和in查询
4、hash冲突后,链表过长会导致索引搜索性能下降

B+树

  • MySQL中最常用和最好用的索引结构
    MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引_第3张图片

1、非叶子节点不存储数据,只存储索引,可以存放更多的索引
2、叶子节点包含所有索引字段,并且叶子节点存储左右两侧数据库的指针,提高范围查询的性能

Innodb和Myisam引擎的索引结构区别

Innodb 的索引结构

1、主键索引是聚簇索引,叶子节点存储主键索引和数据集
2、二级索引是非聚簇索引,叶子只存储索引字段和主键
3、Innodb的数据文件有两个,.frm是表结构文件,.ibd是索引和数据存储的文件
主键索引结构MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引_第4张图片
二级索引机构MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引_第5张图片
联合索引结构MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引_第6张图片

Myisam的索引结构

1、主键索引是非聚簇索引,叶子节点存储主键索引和数据集的地址
2、二级索引是非聚簇索引,叶子节点存储索引字段和主键
3、Myisam的数据文件有3个,.frm是表结构,.myi是索引文件,.myd是数据文件
MySQL进阶【二】—— 一文讲清楚为什么MySQL选择B+树索引_第7张图片

结语
  • MySQL的数据查询过程,二级索引需要回表到主键索引才可以查询出数据
  • MySQL加载索引时,按页加载,一个索引页16K,所以三层索引树,可以支持2000万左右的数据查询。
  • 索引是一个有序的数据结构,当有序性被打破时,索引不生效。例如在字段上加函数、左侧模糊查询、联合索引不符合最左前缀等,皆是无法找到有序的索引树。(左侧模糊匹配时,无法知道字段左侧还存在多少字符,无法利用已知的索引去匹配,只能全表扫描)

你可能感兴趣的:(MySQL,mysql,索引,数据结构,innodb,java)