MySql索引的本质的简单解析

索引的本质的解析

什么叫慢查询:
SQL默认有个规定:只要10秒钟没有按照规定的时间返回结果,都属于慢查询。

怎么优化呢?–:可以通过索引进行优化。

索引是帮助MySql高效的获取数据的排好序的数据结构。

索引数据结构: 二叉树,红黑树,Hash表,B-Tree
在这里插入图片描述

表中有两列七行。我们查找第6行数据,如果没有索引我们查询的时候是
select * from t where t.Col2 =89; 如果没有索引的时候,数据库时进行逐行检查对比的,进行查找的。 如果表很大,那么就会查询很久。 假设使用二叉树的数据结构。将索引的字段放入二叉树。
那么可以从二叉树里面查出结果。 二叉树:左边比父小,右边比父大。 节点呢是 key-value的结构。 key存储值,value存储地址。

红黑树和b数的解析

但是mysql的底层并不是使用的二叉树,因为有弊端。而是使用的b数或者b+数的结构。

使用二叉树的弊端:比如使用 select * from t where t.Col1 =6; 那么就要使用col1作为索引的字段。
col1 他是一个自增的主键。二叉树维护的时候是一直都是在右侧进行添加的。只是一个链表。
在下面官网可以查看维护过程。
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
使用二叉树单边的插入的话这个索引和不使用的索引是一样的。

红黑树: 是一种二叉平衡树。 单边插入的时候就会进行平衡。 但是使用这种方式进行存储的时候数的高度会很高,如果要查询的元素在叶子节点,那么要招数的高度的次数。也是很费时间的。

所以我们在编写的时候就控制数的高度小于4.

我们可以考虑的是让每个节点都存储多个索引,每个索引的分支也是同样的索引。这样存储的数据不就很多了吗?
这样的结构其实就是B-Tree的结构。
在这里插入图片描述

数据是存放在硬盘中的,每次访问的时候都是将一层的数据将从硬盘中读取到缓存中。在缓存中读取的时候是很快的。 如果我们将所有的数据都保存在一层中时那会不会更快?其实不是的。想一下如果几千万的索引都存在一个节点的时候,拿出的时候速度是很慢的,而且也不肯讲所有的元素都读取出来。我们学过计算机组成原理,知道每次load的时候,load几个G的内存的时候是非常慢的。所以我们要有个度。

mysql设置的16kb。因为16kb是已经可以够使用的了。

mysql使用的也不是b-tree的结构,而是改进了这种结构是一种B+Tree的结构。(图片中叶子节点的连接是双向的)
在这里插入图片描述

他是在b数上的一个更改。 可以看到不同的是非叶子节点是没有值和没有指针的。其实就是叶子节点存储了数据库中的所有的值。为什么要改成这样呢?----B+tree其实就是有个多层的平衡树。每层都是从小到大。而且是将叶子节点的中间元素作为一个冗余的索引。
首先回答为什么每行中去除了data–以为mysql是16kb 去除data后可以存储的索引可以更多。那样分叉的就可以更多了。。。 假设索引都是采用bigInt的方式,每个索引假设是8B ,后面的地址采用的是6B那么一共就可以大概知道一个节点大约存储的是1170个个索引在这里。假设我们有3层的高那么当所有的元素都满了。能放入得数据是很多的。。。

myisam存储引擎索引的解析

数据库中的表和索引都是放在哪了? 是放在磁盘中的。
首页要知道 存储引擎是指修饰的表,虽然数据库也有,但是最终还是以表的为主。
myisam 的底层存储是由3个。.frm 结尾的是存储表的结构 .MYD存储的是数据行的记录 .MYI 存储的是index,就是存储的索引字段。而且主要是使用的B+tree的结构。

在这里插入图片描述

数据是存放在 myd中 索引是存放在myi中。
所以mysql的执行是现在myi中找到数据的地址,然后在定位到myd中。所以他是跨文件的。

InnoDB存储引擎索引的解析

还有一种存储引擎,也是我们用的比较多的存储引擎就是innoDB存储引擎

在这里插入图片描述

它的底层是在文件夹中的文件只有两个文件。一个是ibd文件,这个文件主要是存储的数据和索引。另一个是ifm,也是存储的框架表结构之类的。
它也是一个B+数。但叶子节点是将所有的数据都放入进去。这样在查询的时候就不用在访问表了。

聚集索引:叶子节点就包含了所有的数据。
非聚集索引:叶子节点就包含一个地址。

为什么inndb必须要主键? 当你没有建立主键的时候,inoDB 它会帮你在数据库中找到一个唯一不重复的数据来表示成唯一的主键。要是都选的不是唯一的呢?那么他会在后台自动选择出一个字段。
为什么使用整形自增的呢? 假设使用的是UUID(不是整形,也不自增) 。我们在查找的时候都是进行对比,再进行查找。可以考虑一下是字符串查找快还是整形快? 答案不言而喻。而且整形的存储的空间也是很小的。可以节约资源。
为什么推荐自增呢? 前面提到b树和b+树是不同的。主要是在叶子节点上,b+树上是有个指针关联的。 为什么要搞这个指针呢? 我们知道mysql的索引有两种 主要是b树另一种是hash。当采用hash存储的时候,会先进行hash运算,将数据存入表中。hash就是一种散列算法。键是hash,值是地址。而且查找的时候是很快的。但为什么不是用呢?因为在使用范围查找的时候使用hash的时候基本不可能了。所以一般的情况下就不使用hash。B数也是很难支持范围查找,当查找大于某个值的时候每次只能查询一个范围的值,要查询多次,所以不可以的。 但b+树是可以的。而且B+数的叶子节点也是有序的。所以建议使用的是自增的。

联合索引的地城存储结构长什么样?

他是先比较第一个字段,再比较第二个字段,再比较第三个字段。。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值