深入浅出Mysql 第四期

高效查询的秘诀:索引

探究技术的本质,享受技术的乐趣!今天我们来聊聊Mysql中的索引。根据万事万物,存在即合理这条不变的法则,我们抛出今天的第一个问题,为什么会出现索引?我们都知道数据库是用来持久化数据的,能够在需要的时候检索出我们需要的数据,然而随着数据越来越多,从海量的数据中查找出我们需要的数据,无异于大海捞针,费时又费力。那么索引就是用来解决这个问题的,索引能够让我们快速从一大堆数据中找到我们需要的。就像目录一样,可以快速定位。那么我们不妨想想我们学习的基础数据结构中,有哪些数据结构可以快速查找到我们需要的数据。如果足够熟悉数据结构,那么Hash表你一定能想到,因为他能够在O(1)的代价下找到你需要的值。那索引的底层实现就是Hash表?很显然不是,因为它存在一个缺陷,那就是范围查询需要遍历整个数据,而往往数据库中的数据是海量的,这不合适。那如果是有序数组呢?我们可以利用二分查找在O(logn)的代价下找到我们需要的值,又因为有序,针对范围查询也不过是O(logn)的代价,这很优秀,但是数组也有一个致命的问题,插入和删除某个元素,需要挪移位置,这代价很大,最坏的时候能够达到O(n)。拥有二分特点,而且对增删友好的数据结构就只有二叉搜索树了。二叉搜索树同样可以借助数组的思路寻找起始位置,如果能够一直维持树的平衡,代价就是O(logn),然后从这里开始中序遍历直到遇到比终止位置大的数。同样增删的操作代价也是O(logn)。这个数据结构很好,等值查询效率也高,范围查询效率也高,而且插入和删除的代价也不是很高。然而他有一个致命的缺陷对磁盘不友好。这和磁盘的原理有关,要将磁盘中数据读入内存中,只能一个一个数据块的读取,如果是二叉搜索树,那么一个数据块的数据就很少,就需要读取多个数据块,而从磁盘读数据到内存这个过程耗时巨大。所以尽管二叉搜索树很完美了,但是针对数据库这个场景还不够好,于是人们利用N叉树来解决这个问题。这个N叉树的子节点从左到右按顺序排列的。而Mysql采用的数据结构就是N叉树的一种B+树。

B+树的具体结构你可以百度出来,这里就不赘述了,在Mysql中索引分为两种,一种是主键索引,一种是非主键索引。主键索引是由B+树根据主键构建出来的,叶子节点是一条条完整的记录,也被成为聚簇索引。由于索引中就有完整的记录,也被叫做索引组织表。而非主键索引仍然是由B+树构建,唯一不同的是,叶子节点不是完整的记录,而是对应主键的值。换句话说如果利用非主键索引查找记录,需要进行两次查找过程,第一次从非主键索引中找到记录的主键值,再从主键索引中根据主键值找到对应的记录,这个过程也被叫做回表。这也是为什么很多Mysql的最佳实践中要求尽量使用主键查询。

好今天的内容就到这里,下一期我们接着聊索引。我们下期见

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值