Mysql索引底层数据结构

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

为什么要创建索引呢?

因为它有以下优点:
(1)通过索引可以减少数据的扫描量(就好比将全书扫描,变成了根据目录找)
(2)索引可以把对硬盘的随机IO变为顺序IO
(3)索引可以在排序、分组等操作时避免创建临时表
(4)大大加快数据的查询速度

创建索引有什么缺点呢?

**1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。**

索引的使用原则:

通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。

1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引

2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。
       
索引存储在文件里
索引结构:
1.二叉树
2.红黑树
3.Hash
4.B树

MySQL选择B+树作为索引的底层数据结构,
B+树底层存储数据:
1.非叶子节点不存储data,只存储key,可以增大度
2.叶子节点不存储指针
3.顺序访问指针,提高区间访问的性能
下面我们通过对比来阐明选择B+树作为底层数据结构的原因:
1.二叉树与B+树相比
(1)二叉树查询和排序效率低于B+树,因为它可能退化成链表 二叉一次范围缩小1/2,B+树一次范围一次缩小1/m
(2)二叉树索引从文件中加载内存 io很耗时 一次只能加载一个节点,但是B+树一个节点存放多个数据 一页(内存的单位4k)
(3)平衡二叉树不虽然会退化成链表,但其需要旋转很多次,索引结构变化太频繁,IO很耗时 一次只能加载一个节点
2.红黑树与B+树相比
红黑树从任意一个节点开始,到它的任何一个叶子节点黑色节点的数目是相同的 查询效率低 io很耗时 一次只能加载一个节点
3.Hash与B+相比
(1)因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询
(2)由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定 按照顺序排列,所以无法利用Hash索引来加速任何排序操作
(3)不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。
(4)当哈希值大量重复且数据量非常大时,其检索效率并没有B+索引高的。
4.B树和B+树相比:
(1)1.B+树比较容易控制高度mysql限制索引树的高度不能超过三层
(2)B+树对所有数据查询的效率是平均的;B+树只在叶子节点存放数据,非叶子节点只存放关键字。但是B树非叶子节点 存放的关键字同时又是数据。B树查询效率不平均(离根节点近的查询快,离根节点远的查询慢)
(3)B+树用链表将叶子节点连接起来。适合做范围查询和排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值