文章目录

  • 更多干货
  • Pre
  • 索引的数据结构选型
    • 二叉树 ?
    • 红黑树 ?
    • B-Tree ?
    • B+Tree
    • Hash表
  • 搞定MySQL

更多干货

带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试


Pre

什么是索引?

通俗的说就是为了提高效率专门设计的一种 排好序数据结构

怎么理解呢?

举个例子哈

如上数据 ,假设有个SQL

select *  from t where  col2 = 22 ;

如果没有索引的话,是不是得逐行进行全表扫描,走磁盘IO…

如果加上一个合适的索引呢?

比如用一个二叉树

二叉树我们知道,右边的比左边大

那执行刚才的SQL的话,第一条记录是34 ,那我们查找的是22, 是不是就只要到它的左边查找即可,因为右边的数据都比34大,肯定没有22 ,找到22 以后, 搞定 ,I/O次数是不是比刚才的全表扫描的次数少很多,那效率自然就高了。


索引的数据结构选型

二叉树 ?

可以用二叉树吗? 我们知道MySQL一般都有自增主键 ,id之类的字段

我们来演示下使用二叉树来存储这种自增的数据的话,会怎样?

https://www.cs.usfca.edu/~galles/visualization/BST.html

那查询

select * from t where id = 7

自增主键的时候 这个二叉树已经退化成链表了。。。。。

想想,一个几百万数据量的表 ,查找某个大一点的id , 逐个查找比对 (这些数据也是存储在磁盘上的,还得从磁盘上捞啊) 这I/O 这效率可想而知吧…

二叉树 pass ,不考虑了

既然退化成链表了,那试试带有平衡功能的树 二叉平衡树 (红黑树)?

自增主键, 退化为为链表


红黑树 ?

二叉树既然在某些情况下会退化成链表, 那如果这棵树能自动平衡呢?

这样子是不可能变成链表了,

同样 查询

select * from t where id = 7

三次磁盘I/O即可找到, 比刚才二叉树的七次是少了些哈 ,自然查找效率也比二叉树高了

可如果数据量几百万 上千万呢?

这棵树 得多高哇。。。

数据量大, 树高问题

那既然树高不好, 是不是如果可以控制树的高度(比如 3 到4层的高度,这样查询起来还能接受),让每一层能存储更多的数据,然后再分裂,这样的话数据量相乘起来,也是不少了对吧,这样就能存储更多的数据,这样会不会好一点? ----> B-Tree


B-Tree ?

  • 叶节点具有相同的深度, 叶节点之间指针为空
  • 所有索引元素不重复
  • 节点中的数据索引从左到右递增排列

叶子节点之间的没有指针,区别于B+树。

data存储的是数据对应的磁盘地址, k-v结构。

我们来看下B-Tree的插入 (Max.Degree 设置为3 即 元素到了3个就分裂 )

查找一下

3次

MySQL也没有使用B-Tree , 因为

除了存储索引以外,还存储了data(数据对应的磁盘地址) , 为了更多的存储数据,MySQL对B-Tree进行了很多改造

由此演进出了 B+Tree ,将data部分仅保留在叶子节点上,这样的话同等的页可以存储更多而索引数据。


B+Tree

  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高区间访问的性能

数据仅存储在叶子节点, data可能是磁盘地址也可能是其他的列数据,这个和存储引擎有关系。

叶子节点之间有指针相连。

我们来算下 3层高的B+Tree能存储多少数据结构

假设是BigInt类型的数据

BigInt 占 8个字节 ,同时还是用6个字节存储了它指向的数据的物理地址

MySQL在使用innodb引擎的时候页大小默认是16K ,查询如下

mysql> SHOW GLOBAL STATUS like 'Innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)mysql>

假设 树高为3 , 这样的话,第一层即可以存储 16KB * 1024 / (8B + 6B) = 1170

同样的第二层也是1170 (第二层不是叶子结点,不存储数据)

第三层,存储数据,一般情况下一行数据的大小肯定不会超过1KB,那我们就按照1KB算吧

3层高的B+Tree , 存储BitInt可以存储 1170 * 1170 * 16 = 2千1 百万。。。。这效率还是可以的哈

想一想 如果是4层高的数 1170 * 1170 * 1170 * 16 = 250多亿数据。.。。。

当然了 都是估算, 如果换成其他类型的数据,每个表的行数据的大小都是相关的,这也就是我们通常说的 MySQL的表到千万级别就要分库分表的理论依据了。

我们看下B+Tree的插入和查找


Hash表

  • 对索引的key进行一次hash计算就可以定位出数据存储的位置
  • 很多时候Hash索引要比B+ 树索引更高效
  • 仅能满足 “=”,“IN”,不支持范围查询
  • hash冲突问题

对索引字段进行hash以后, 还存储了数据对引得磁盘地址。

一般请款下,hash 比 b+tree的效率要高 ,但工作中绝大部分还是使用的B+Tree , 因为hash对范围查找不是很友好,还要全表扫描

为啥B+Tree 支持范围查找?

我们知道B+Tree的叶子节点 有指针相连,从根节点找到对应的叶子节点后, 加上节点本身就是排好序的,所以范围查找就恨轻松了。

B-Tree 没有指针相连,所以要想范围查找,还得从根节点重新找,效率肯定比B+树低 。


搞定MySQL

MySQL - 剖析MySQL索引底层数据结构相关推荐

  1. 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  2. Mysql——索引底层数据结构与Explain用法

    Mysql--索引底层数据结构与Explain用法 一.索引底层数据结构 1.Mysql不同引擎对应的数据结构 2.B+Tree数据结构 2.1. 二叉树 (Binary Search Trees) ...

  3. MySQL索引底层数据结构原理剖析

    一. 前言 1. 说明 我们平时所说的:聚集索引(主键索引),次要索引,覆盖索引,复合索引,前缀索引,唯一索引在MySQL5.7和 8.0版本默认都是使用B+Tree索引,除此之外还有 Hash索引. ...

  4. mysql索引数据结构图解_深入理解Mysql索引底层数据结构与算法

    索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构. Q1:大家使用索引有没有想过这个问题?为什么索引能够帮助mysql高效获取数据?我一一给大家道来!在给大家讲之前,先更大家分享一 ...

  5. mysql索引底层图_MySQL索引底层数据结构

    一.何为索引? 1.索引是帮助数据库高效获取数据的排好序的数据结构. 2.索引存储在文件中. 3.索引建多了会影响增删改效率.(一张表最多允许建16个索引) (下面这张图为计算机组成原理内容,每查询一 ...

  6. MySQL 索引底层数据结构实现

    文章目录 概述 讨论范围 查询数据结构 查询数据结构种类及其高性能查询原理 MySQL 索引的底层数据结构 MySQL 索引的需求分析 选择 MySQL 索引的底层数据结构 B- 树和 B+ 树的对比 ...

  7. mysql 联合主键_深入理解Mysql索引底层数据结构与算法,背后的故事

    引言 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据.如果col2是索引,查找索引为89的行元素,那么只需 ...

  8. mysql 索引底层数据结构与算法

    索引:是帮助MySQL高效获取数据的排好序的数据结构. mysql 索引的底层数据结构: 二叉树:如果是规律性数据,比如1,2,3.....等数据,存储容易成线性结构,数据规模太大之后,查询太慢. 红 ...

  9. MySQL索引底层数据结构

    MySQL相信大家都不陌生,索引的日常使用应该也是比较频繁的,今天就聊一聊索引底层的数据结构; MySQL索引底层为什么使用B+树而不是二叉树;红黑树;B树? 索引:索引是帮助MySQL高效获取数据的 ...

最新文章

  1. winstore独立安装包下载_QT使用教程(二)之下载篇
  2. 双12众商超沦陷,你是否习惯了扮演观众?
  3. 汇编:call指令的应用
  4. How to run a estimaton
  5. ORACLE11G自动维护任务简析
  6. java udp 接收不定长_JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧?...
  7. LNMP服务器安装配置(Rhel+Nginx+PHP+MySQL)
  8. 【渝粤教育】国家开放大学2018年春季 0341-22T高级英语听力(2) 参考试题
  9. scp在Linux主机之间copy不用输入密码
  10. flush什么意思中文翻译_flush是什么意思
  11. 高动态范围图像是什么
  12. ‘telnet‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  13. 123.PHP 周边性能优化
  14. [C/C++] C/C++延伸学习系列之STL及Boost库概述
  15. Unity3D实现AB包加载资源
  16. python自动化办公(五)实现将读取的excel数据写到word指定的地方:示例(劳动合同)
  17. U-BLOX GPS 模块及GPRMC指令解析
  18. 云服务器部署论坛系统discuz,腾讯云服务器利用镜像搭建Discuz!论坛完整教程
  19. 二阶梯度优化新崛起,超越 Adam,Transformer 只需一半迭代量
  20. 计算机主机安全属性包括,计算机安全属性包括哪些

热门文章

  1. android webview 多文件上传,Android中的webview支持页面中的文件上传实例代码
  2. 详细分解Transformer各部件总结
  3. python实用小技巧
  4. python 去除字符串里所有标点符号
  5. 画出沪深300指数曲线
  6. 灾难恢复级别_防患于未然:灾难恢复全攻略,助你有效恢复业务数据
  7. lwip协议栈优化_干货分享 | KNI性能优化实践
  8. Leetcode 剑指 Offer 11. 旋转数组的最小数字 (每日一题 20210916)
  9. NLP 笔记: 序列标注与BIO标注
  10. torch_geometric笔记:nn. graclus (图点分类)