聊聊Mysql索引那些事

什么是索引?

  • 索引就是能够快速查找的数据结构
  • 索引是一个文件

索引的数据结构类型

  • Hash索引
  • 二叉树
  • 红黑树
  • 等等

索引的必要

从计算机系统的方面来分析索引存在的必要,在ssd出来之前都是机械硬盘,用进行一次io就需要指针在硬盘上面旋转找到合适的地址,然后读取。如下图:
机械硬盘
将圆盘的周长展开,可以看到的更直接如下图:
这里写图片描述
图中所示,当需要查找1时,时间复杂度为1,当查找2时,复杂度为2,所以他的复杂度为O(n) ,所以当圆盘的旋转速度越快时,这个硬盘的性能就越好,IO读取的也快,当年的电脑配置上有写多少多少转,就是这个意思。操作系统中,为了优化速度,应用了局部性原理

空间局部性原理 ——操作系统中的page,将几个地址,存在一个区域中,方便查找,如在上图中把1、2、3、4
存在一个page中,可以先通过查找page,再查找地址。 时间局部性原理 ——运用了缓存

Mysql更加青睐B+tree

Hash:Hash的数据结构是非常常见的,比如在Hashmap中(本博客中有一篇HashMap源码分析),可以通过Hashcode直接来获取val,时间复杂度为o(1),看起来非常的快速。但是有一点,当遇到范围查找时,无能为力索引等于不起作用。
二叉树:这里就不分析了,太常见了
红黑树:主要运用在Treemap的源码中。一种特殊的二叉查找树。每个节点上面有一个单独的储存位表示颜色
特点:
1、每个节点或者是黑色,或者是红色。
2、根节点是黑色。
3、红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)
4、对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。

在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件3或条件4,需要通过调整使得查找树重新满足红黑树的条件。
调整策略:
左旋和右旋 改变颜色 时间复杂度 Lg(N)
具体的红黑树的操作,这里不做分析,可以看下面这个博客,写的很不错
http://www.cnblogs.com/skywang12345/p/3245399.html (描述特别准确,但是图有点不对应)

B tree :也是一种特殊的树

一棵m阶的B-Tree有如下特性:
1. 每个节点最多有m个孩子。
2. 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
3. 若根节点不是叶子节点,则至少有2个孩子
4. 所有叶子节点都在同一层,且不包含其它关键字信息
5. 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
6. 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
7. ki(i=1,…n)为关键字,且关键字升序排序。
8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)

如图:
这里写图片描述

B+Tree :与B-Tree有几点不同:

1、非叶子节点只存储键值信息。 2、所有叶子节点之间都有一个链指针。 3、数据记录都存放在叶子节点中。

如图:
这里写图片描述

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 可以通过这个网站看一些数据结构是怎么样存储的。
通过上图中,可以看出,B+Tree中,获取每一个节点的IO次数是相同的。并且在Mysql的规定中,查询数据的最多IO次数为3-5次。同时,上图中可以看到B+Tree的设计的巧妙,当范围查找时,可以通过链表查找到后面的树

扫描二维码关注公众号,回复: 2583387 查看本文章

MyIsAm 和 InnoDB

MyIsAm

分析目录结构,打开mysql的文件可以看到,使用MyIsAm的数据库含有
xxx.MYD — 数据
xxx.frm — 表的定义
xxx.MyI — 索引

可以得到如下图的关系
这里写图片描述

在B+Tree中的value存储了他的物理地址,由物理地址再去MYD文件中查找对应的数据,key则存储了他的主键ID
也叫做非聚集索引——索引文件和数据文件分开

InnoDB

分析目录结构,打开mysql的文件可以看到,使用InnoDB的数据库含有
xxx.frm — 表的定义
xxx.idb — 数据
可以得到如下的关系:
这里写图片描述

在InnoDB中存储的方式也是B+Tree,但是所存储的value不一样,这里是存储了所对应的一整条具体的数据,而不是一个物理地址。所以与MyIsAm相比,这个少了一个物理地址的查找过程,所以更方便快速。而且可以看出,在InnoDB中的表结构,是必须通过索引来存储的。如果没有规定主键,Mysql有自己的处理方式。

1、自动的选择6位长整型作为主键 2、自动生成隐形的ID

在平时的业务中,经常会规定要使用自增的主键。由上文可以分析出这样的原因
1、空间占有大,由于在新增副索引时,需要存放主键,所以不建议用很长的数据来做主键
2、在B+Tree中,在末尾插入最方便,也最高效。在中间插入住频繁的引发树的调整,消耗不必要的内存
3、采用连续的主键,减少了碎片

猜你喜欢

转载自blog.csdn.net/wkztselina/article/details/80727750