萌新第一篇博客之Mysql索引介绍

一.索引为何物

mysql中的索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。形象的说,将数据库比作为一本书,那数据库中的表则为书中的内容,若是想快速翻到指定的内容单元,我们需要借助书的目录在找的该内容单元的位置,索引就相当于‘目录’,承担着指向不同单元的任务。

图例:在这里插入图片描述
索引对于提升数据库的性能有很大的帮助,充分利用索引,可提高查询数据的效率。

二.索引的缺点

引入索引确实能够帮助我们提高查询效率,但也要付出一些小小的代价
(͡° ͜ʖ ͡°)
1)引入索引,需要消耗额外的储存空间

2)引入索引,会影响到增删改操作,此时数据库不仅要对新增数据进行保存,也要对索引进行更新

尽管如此,在实际应用中,还是推荐使用索引
1)针对消耗额外的储存空间,我们可以通过加装硬盘,硬盘往往不是主要矛盾。
2)对于增删改不全是负面影响,且在实际开发中,查询的使用频率远大于增删改。

三.索引的使用

注: 创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

  • 查看索引
show index from 表名;

例:查看学生表已有的索引

show index from student;
  • 创建索引

/对于非主键、非唯一约束、非外键的字段,可以创建普通索引/

create index 索引名 on 表名(字段名);

例:创建班级表中,name字段为索引

create index idx_classes_name on classes(name);

注:创建索引是一个"危险操作",一旦表中数据量过大,此时创建索引操作就可能触发大量的硬盘IO,直接把机器卡死。因此,我们最好在最初创建表时,就规划好要有哪些索引

  • 删除索引
drop index 索引名 on 表名;

例:删除班级表中name字段的索引

drop index idx_classes_name on classes;

注:只能删除自己创建的索引,不能删除自动生成的索引。且删除索引同样为危险操作,需谨慎对待!!!

四.索引的背后的数据结构

当思考起索引是如何实现的,学过数据结构的你,第一反应可能是二叉搜索树或者哈希表。
噢!我的朋友,你的感觉是对的,毕竟它们都很擅长进行查找操作。
但是,实际上两者都不适合给数据库做索引。

  1. 二叉搜索树,最大的问题在于“二叉”,当要保存的元素多的时候,就会使整个树的高度变得比较高~~~
  2. 哈希表尽管查询速度上可以达到O(1),但最大问题在于它只能进行“相等”查询,无法进行">“,”<"这样的范围查询,也无法进行like模糊查询。

此时,就得借助B树的力量了。

B树

B树,也称B-树,可以理解为“N叉搜索树”,其中N为树的阶树,若N=2,则为二叉树。
这样,树的结点就能有多个子树了,且节点储存的key值也能有多(N-1)个。

特点:

  1. 每个结点最多有N-1个关键字。
  2. 根结点最少可以只有1个关键字。
  3. 每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  4. 所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。

简单图例:
在这里插入图片描述

B+树

B+树是针对B树做出的进一步改进的数据结构,它比 B 树更适合实际应用中操作系统的文件索引和数据库索引。
不同于B树,B+树划分的区间数量与节点中key的数量相等,且父节点会作为子节点的最大值再次出现。
如图所示:
在这里插入图片描述
B+树的优势:

  1. N叉搜索树,高度比较低,此时硬盘IO的次数就比较少。
  2. 叶子节点是全集,并且用链表连接,利于查询。
  3. B+树所有的查询都是要落到叶子节点上完成的,任何一次查询所经历的IO次数和比较次数都差不多,查询开销较为稳定。
  4. 由于B+树叶子节点是全集,非叶子节点上不必储存“数据行”,只需储存索引列的key即可,使得非叶子节点消耗空间比较少。

以上就是全部内容,如有错误和纰漏,欢迎指正。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值