数据库

数据库重点知识点-索引

2020-01-28  本文已影响0人  Michaelhbjian

索引是数据库中必考的知识点,平时工作中的优化也是从索引入手,所以有必要对索引清楚的认识。下面的文章是基于上Java3y 的文章修改而来的,里面的知识点确实太多,某些地方需要深入研究,目前对索引的知识点进行全面熟悉,后续根据实际业务来写对应的知识点。

1、索引的相关问题

在之前,我对索引有以下的认知:

看起来好像啥都知道,但面试让你说的时候可能就GG了:

2、MySQL的基本存储结构

首先Mysql的基本存储结构是(记录都存在页里边):

img image-20200126123425310

3、索引提高检索速度

索引做了些什么可以让我们查询加快速度呢?
其实就是将无序的数据变成有序(相对)

image-20200126123601769

要找到id为8的记录简要步骤:

image-20200126123653855

很明显的是:没有用索引我们是需要遍历双向链表来定位对应的页,现在通过“目录”就可以很快地定位到对应的页上了!

其实底层结构就是B+树,B+树作为树的一种实现,能够让我们很快地查找出对应的记录。

4、索引降低增删改的速度

B+树是平衡树的一种。

什么是平衡树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

如果一棵普通的树在极端的情况下,是能退化成链表的(树的优点就不复存在了)

image-20200126123731859

B+树是平衡树的一种,是不会退化成链表的,树的高度都是相对比较低的(基本符合矮矮胖胖(均衡)的结构)【这样一来我们检索的时间复杂度就是O(logn)】!从上一节的图我们也可以看见,建立索引实际上就是建立一颗B+树。

B+树删除和修改具体可参考:

5、哈希索引

除了B+树之外,还有一种常见的是哈希索引。

哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快

image-20200126123832003

看起来哈希索引很牛逼啊,但其实哈希索引有好几个局限(根据他本质的原理可得):

参考资料:

6、InnoDB支持哈希索引吗?

主流的还是使用B+树索引比较多,对于哈希索引,InnoDB是自适应哈希索引的(hash索引的创建由InnoDB存储引擎引擎自动优化创建,我们干预不了)!

image-20200126123912827

参考资料:

7、索引的分类

简单概括:

区别:

非聚集索引也叫做二级索引,不用纠结那么多名词,将其等价就行了~

非聚集索引在建立的时候也未必是单列的,可以多个列来创建索引。

image-20200126124001250 在创建多列索引中也涉及到了一种特殊的索引-->覆盖索引

比如说:

8、索引最左匹配原则

最左匹配原则

例子:

不需要考虑=、in等的顺序,mysql会自动优化这些条件的顺序,以匹配尽可能多的索引列。

例子:

9、索引的总结

索引在数据库中是一个非常重要的知识点!上面谈的其实就是索引最基本的东西,要创建出好的索引要顾及到很多的方面:

10、参考资料

https://zhuanlan.zhihu.com/p/23624390--简单理解索引
https://blog.csdn.net/mysteryhaohao/article/details/51719871--
https://monkeysayhi.github.io/2018/03/06/%E6%B5%85%E8%B0%88MySQL%E7%9A%84B%E6%A0%91%E7%B4%A2%E5%BC%95%E4%B8%8E%E7%B4%A2%E5%BC%95%E4%BC%98%E5%8C%96/---浅谈MySQL的B树索引与索引优化
https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484721&idx=1&sn=410dea1863ba823bec802769e1e6fe8a&chksm=ebd74430dca0cd265a9a91dcb2059e368f43a25f3de578c9dbb105e1fba0947e1fd0b9c2f4ef&token=1676899695&lang=zh_CN#rd

上一篇 下一篇

猜你喜欢

热点阅读