Mysql索引底层数据结构、算法及索引存储引擎

mysql官方有句很经典的话:

           索引是帮助MySQL高效获取数据的排好序数据结构。

索引数据结构 :二叉树、 红黑树、 Hash表、 B-Tree。

        索引的目的是为了减小查询时间,提高查询效率。怎么减小查询时间呢?这就需要我们减少内存读取磁盘的次数,每查询一次节点数据,就会访问磁盘一次,二叉树和红黑树每个节点只能存储一个数据,如果数据成百上千万,那么树的高度会非常大,如果碰巧查询的数据在最后的节点上,那么就会访问磁盘十几次甚至几十次,这就很消耗性能的。

索引类型是hash,存储时会把数据进行hash运算,快速的知道数据文件的磁盘指针,这种算法

       mysql中存在两种索引类型,hash和BTREE,hash的查询速度是最快的。这种方式的查询效率是非常高的,因为我不管你有几百条还是几亿条数据,我只要索引经过hash运算就可以获取数据的磁盘指针,快速查询数据。但hash类型的索引有很大的缺点,这种索引类型没法进行范围、模糊排序的快速查找。

B-Tree :

  •  叶节点具有相同的深度,叶节点的指针为空 ;
  • 所有索引元素不重复 ;
  • 节点中的数据索引从左到右递增排列;

Mysql索引底层数据结构、算法及索引存储引擎_第1张图片

B+Tree(B-Tree变种) :

  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高区间访问的性能

        节点中的数据索引从左到右递增排列,每个节点的最后都有一个小的空间存储下一个加点的指针,如果是最后的节点,则指向当前行的第一个节点;

Mysql索引底层数据结构、算法及索引存储引擎_第2张图片

MYISAM存储引擎索

MyISAM文件和数据文件是分离的(非聚集),mysql的数据文件是存储在data目录下的,data下每个文件夹存储的就是每个数据库的文件,一个MyISAM表可分为三个文件:.frm(表结构).MYI(表索引).MYD(表数据);每个叶子节点存储的都是数据的磁盘指针

Mysql索引底层数据结构、算法及索引存储引擎_第3张图片

INNODB存储引擎:

InnoDB索引实现(聚集) :

表数据文件本身就是按B+Tree组织的一个索引结构文件

聚集索引-叶节点包含了完整的数据记录

常问的面试题:

  1. 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
  2. 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

INNODB文件和数据文件是聚集的,每个INNODB表可分为两个文件:.frm(表结构),.ibd(表索引和数据)主键索引叶子节点存储的是主键(key)和数据(value),非主键索引的叶子节点存储的是索引的数据(key)和主键(value)

主键索引树:

Mysql索引底层数据结构、算法及索引存储引擎_第4张图片

非主键索引树:

Mysql索引底层数据结构、算法及索引存储引擎_第5张图片

.联合索引的地城存储结构:

Mysql索引底层数据结构、算法及索引存储引擎_第6张图片

联合索引非叶子节点存储的是联合索引的数据(key)和主键(value),其索引的顺序是按索引常见的顺序排的,先按第一个索引排序,再按第二个索引排序......

你可能感兴趣的:(mysql,索引,数据结构,索引存储引擎)