MySQL进阶之索引

1. 什么是索引

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足
特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构
上实现高级查找算法,这种数据结构就是索引。

2. 特点

MySQL进阶之索引_第1张图片

3. 索引的结构

MySQL进阶之索引_第2张图片

4 选用B+tree树的原因

二叉树 是经典的快速查找算法 ,但是有两个缺点

  1. 如果是顺序插入,如插入10 后,再依次插入9,8,7,6,5,4,3,2,1就会变成一个链表
  2. 如果数据量比较多,就会出现层级很深的二叉树,检索效率下降

为了解决这个问题
我们引入了红黑树 ,它会自动平衡叶子节点数,最后得到一平衡二叉树,
这解决了顺序插入成为链表的情况 但是,层级问题依旧没有解决,

于是,出现了B-tree

4.1 B-tree

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。
以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5个指针:

MySQL进阶之索引_第3张图片
这里每个节点上面可以存放四个key,对应下面区间为5个,所以也叫做5阶, 并且 每个key下面存放对应的数据值

特点:

  • 5阶的B树,每一个节点最多存储4个key,对应5个指针。
  • 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
  • 在B树中,非叶子节点和叶子节点都会存放数据。

思考

为什么mysql选用B+tree?

  1. 相对于二叉树,层级更少,搜索效率高;
  2. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
  3. 相对Hash索引,B+tree支持范围匹配及排序操作;

5.常见的索引

  1. 主键索引
  2. 唯一索引
  3. 常规索引
  4. 全文索引
    MySQL进阶之索引_第4张图片
    其中全文索引与es中使用的都是倒序索引的方式来快速对文本进行查询

5.1 聚集索引和二级索引

聚集索引: 本质上来看就是B+tree的的标准形式,节点上存放key,最下层存放的真实的数据(全局唯一)
二级索引: 本质是节点上存放key,但是最下层节点存放的是数据对应的主键(可以有多个)

聚集索引选取规则:

  1. 如果有主键,主键索引就是聚集索引
  2. 不存在主键的话,存在unique索引,那该唯一索引就是聚集索引
  3. 如果没有主键索引也没有unique索引,那么 mysql就会自动生成一个rowid作为隐藏的聚集索引
    MySQL进阶之索引_第5张图片
    上图就是标准的聚集索引和二级索引 这里 当使用二级索引的时候就会先查询到主键 id , 然后去回表查询 回到聚集索引上通过查询到的id去查询真正的数据
    MySQL进阶之索引_第6张图片
    拓展一下

一般来说当输的层级到三,大概能存放2200W数据,
再多的话就建议分库分表了

5.2 索引的语法

  1. 创建索引
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
index_col_name,... ) ;
  1. 查看索引
show index from table_name;
  1. 删除索引
drop index index_name on table_name

你可能感兴趣的:(b树,数据结构)