mysql索引数据结构

一、索引

1. 什么是索引

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

2.索引的数据结构

① 二叉树(Binary tree)

定义:是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树。

特点:左子树小于父节点的值,右子树大于父节点的值。

 

缺点:当列的值是自增时,会出现单边树,退化成链表结构。(故mysql没有采用该数据结构)

数据结构模拟链接:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

 

② 红黑树

平衡二叉树,解决了二叉树树里面的单边退化成链表的问题。

缺点:如果针对海量数据时,树的高度不可控。查询的性能也提升不明显。(故mysql没有采用该数据结构)

 

③ Hash表(mysql支持)

特点:1. 对索引的key进行一次hash计算就可以定位出数据存储的位置

   2. 很多时候Hash索引要比B+ 树索引更高效(例如 =,in )

   3. 不支持范围查询

   4. hash冲突问题

 

④ B-Tree

特点:1. 叶节点具有相同的深度,叶节点的指针为空

   2. 所有索引元素不重复

   3. 节点中的数据索引从左到右递增排列

为什么mysql没有采用B-Tree?

1. 非叶子节点可以存放的索引数据少,比如,要控制在树高度为三层的情况下,存放不了太多数据。

2. 范围查询的效率低。

B+Tree(MYSQL采用的数据结构,当然不是最原生的B+树,还是做了一些优化后的B+树)

特点: 1. 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引

    2. 叶子节点包含所有索引字段

    3. 叶子节点用双向指针连接,提高区间访问的性能

数据结构描述:1. 通过冗余索引设计,以上图为例,假如三层高度树,第三层存放的整张表的所有索引和数据。

       2. 第二层存放的是第三层每页数据的最小的索引,第一层又是从第二层的页索引数据中提取最小的进行冗余。

3.索引的分类:

① 聚簇索引(叶子节点包括完整的数据记录,索引和数据)

例如: INNODB的主键索引树

② 非聚簇索引(索引和数据是分开的)

例如:MYISAM的主键索引树、INNODB二级索引

③ 主键索引(一张表只有一个主键索引)

④ 二级索引(非主键索引)

特点:叶子节点存放了主键索引,因此找到二级索引时,还需要根据主键索引进行回表,采用获取到完整数据。

⑤ 联合主键索引(唯一)

⑥ 联合辅助索引(可以不唯一)

二、存储引擎

MySQL表文件都是存放在磁盘中的。存储引擎作用的维度是表。

1. MYISAM

在磁盘中存放的是三个文件,分别为:xxx.frm(表结构)、xxx.MYD(数据)、xxx.MYI(索引)

2. INNODB

在磁盘中存放的是两个文件,分别为:xxx.frm(表结构)、xxx.ibd(数据加索引)

posted @ 2024-06-29 21:54  蜗飞牛  阅读(123)  评论(0)    收藏  举报