MySQL高性能MySQL

搞懂Mysql的索引(页、深度、数据量、IO次数)

2019-08-17  本文已影响51人  可爱猪猪

作者:可爱猪猪 - 帅锅一枚
作者的网名很阔爱,如果喜欢本文章一定要点 喜欢 或者 打赏,拜托~
作者一直在进步,需要你们的支持和鼓励,谢谢!
人生理想:在程序猿界混出点名堂!

为什么要去搞懂Mysql的索引呢?其实有两点:

下面就开始我们的探索,长话短说篇

索引就是为了快速找到你想要的数据。那如何找到你想要的数据呢?
其实索引类型主要有两种HASH索引B+树索引

它不是我们今天的主角,简单说一下,它实际上是基于HASH的散列,了解过JAVA的HASHMAP基本就了解什么是HASH,通过HASH值能够快速定位到某条数据,它也有它的缺点:
比如不能用于范围查找,只能用于精确,再比如对联合索引做HASH,对于联合索引中的某个字段无法用到索引等。所以就有了我们要聊的B+树索引。

大多数情况我们采用B+树,那为什么采用B+树呢?既然这么问肯定就有所比对,为什么不采用二叉树及B-TREE呢?这个问题想必很多都知道,直接揭晓谜底
二叉树相对于B+或者B树,一个很大的优势就是二叉树的深度比B和B+树深,增加了磁盘IO,降低了查找性能。
B-树相对B树,B-树的各层节点要存储数据,导致每页能够容纳的节点就很少,直接导致树深度加大。
这里提到了页了概念,下面我就开始真正揭秘了。

知识普及-扇区、块、页

单元 谁的(归属) 最小大小
扇区 磁盘 512B
文件系统 4K
B+ 16K

想了解更多,可参考这篇文章https://www.cnblogs.com/tongongV/p/10952102.html

B+树的索引结构

想必很多人也了解,直接上图,直接盗取一张:

image.png
图上为id:1-12的12条数据,id为主键索引。白色区域就为一个页。上图画的其实存在一个问题,没有很好的展现B+树的特点,页之间存在一个双向链表
看图我们说一下B+树的特点:

关于IO

那上图查找6需要几次IO呢?2次。先从根节点查找,将页数据去到内存一次,然后查找到第2层的节点又是一次IO,所以两次。
基于B+TREE的特点,一般3层的树就可以存储约2000万条数据?那是如何计算的呢?

计算3层索引树能容纳的数据量

博主写着感觉就像在练乾坤大挪移...第一层...第二层...O(∩_∩)O哈哈~
首先两个假设:

  1. 主键id,我们采用bigint,8字节
  2. 一条数据大小1KB

回表

简单说一下回表,就是根据非主键索引查找到根节点,拿到根节点后,再去主键索引中查找相应数据。

覆盖索引

覆盖索引也就是直接从索引上就可以获取到相应的数据,不需要回表。
比如两个SQL语句
select name from xxxtable where name='张三';
select * from xxxtable where name='张三';
xxxtable中主键索引为id、非主键索引为name
第一个SQL直接从索引树上获取到数据,
第二个SQL需要跟回到主键索引中获取所需的数据。
因此在遇到性能调优时可以考虑这一点优化。

上一篇 下一篇

猜你喜欢

热点阅读