mysql中的索引

1 什么是索引

  • 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,
    并指定索引的类型,各类索引有各自的数据结构实现。

2 索引是为了解决什么问题

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
    索引所起的作用类似书籍目录,可用于快速定位、检索数据。
    索引对于提高数据库的性能有很大的帮助。

3 索引在什么情况下应用

  • 数据量较大,且经常对这些列进行条件查询。 该数据库表的插入操作,及对这些列的修改操作频率较低。

  • 当满足以上两种中的任意一个条件的时候,我们就需要考虑在字段中建立索引,用来提高查询的效率,但是我们要知道索引会占用额外的磁盘空间。

  • 索引一般应用在查找很频繁,但是插入,删除,修改都不频繁的场景。

4 索引的数据结构是什么
(1)为什么不会用二叉树(二叉搜索树)

  • 如果使用二叉搜索树作为数据库的索引,如果二叉搜索树比较平衡,查找效率未O(logN).
  • 二叉搜索树内部中序遍历结果是有序的,如果我们查找主键id < 6并且 >3的学生信息。先找到id位6的元素,再找到id为3的元素。然后再中序遍历3和6之间的元素,就是我们想要的结果,效率比较低是O(N).
  • 我们知道二叉树的每个节点最多凉饿叉,当数据量比较大的时候,树的高度比较高,最终的操作效率也会越低。

(2)为什么不用哈希表

  • 我们知道哈希表精确查找一个数据的时候效率是极高的,但是只能处理相等的情况也就是说只能处理这两个符号 = 和 in 。但是是无法处理 < > 等符号。

(3)真实的索引结构是一种N叉搜索树 => B+树

  • 我们先需要知道什么是B树(也叫做B-树)

  • B树的每个节点都是不是二叉了,而是N叉。每个节点不是存储一个数据,而可能存储多个数据
    在这里插入图片描述

  • 我们从图上来看,每一个节点存储的数据的个数和该节点的毒是相关的,度 = 存储的数据个数+1.

  • 并且再B树上查找,就是一个N分查找,效率是远远高于二叉的,并且由于每一个节点存储了多个数据,每一个节点又有多个度,和二叉树相比,在保存相同个数元素的时候,B树的高度就会比而二叉树低很多,处理范围查找的时候也会更加容易一些。

  • 真实索引结构的B+树也就是从B树上开发而来的

  • 在这里插入图片描述

  • 我们可以看出非叶子节点只保存id,并且去辅助快速找到想要的id对应的节点

  • 叶子节点就是将每一层元素链接到一起了,数据只会在叶子节点上保存,非叶子节点上指挥保存一些辅助的查找的边界信息

  • B+树作为索引,查询每一条记录速度是较为平均的,不会出现效率差异大的情况

  • 不需要进行额外的中序遍历,遍历结果就是中序结果,处理范围查找就更高效了。

  • 叶子放到磁盘上。非叶子放到内存上,查找效率就更高了(减少了读磁盘的次数)

  • 索引在内存中占用的实际开销也不高

(4)主键索引和其他索引

  • 我们上面所讲的可以理解为主键索引,是根据我们所创建的主键id来进行索引的,可是若是当我们不进行主键索引的时候,比如用name来进行索引的时候,我们是先通过索引找到name对应的主键id,在根据主键id去主键索引中查找到具体记录(回表)。

(5)索引语句的应用

  • 查看索引:show index from 表名。
  • 创建索引: create index 索引名 on 表名(属性名)
  • 删除索引:drop index 索引名 on 表名
  • explain: explain后加上一个SQL语句的执行,可以帮助我们分析这个语句是否使用了缩影,以及使用了那个索引。

注释:当我们指定了一个属性为 primary key 查找的时候就是主键索引

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值