深入理解Mysql索引底层数据结构与算法

深入理解MySQL索引底层数据结构与算法 目录 一 理解索引的特性 二 索引的各种存储结构及其优缺点 (一)二叉树 (二)红黑树 (三)Hash (四)B-Tree (五) B+Tree(MySQL索引的真正存储结构) 三. 联合索引底层存储结构 一 理解索引的特性 索引是帮助MySQL高效获取数据的排好序的数据结构 索引存储在文件里 二 索引的各种存储结构及其优缺点 在开始讲这一小节之前,我们先来看一... 阅读详情

索引

索引是帮助MySQL高效获取数据的排好序的数据结构(容易忽略的点:排好序)(形象点就是教科书的目录)

索引存储在文件里(也就是说有IO操作)

索引结构:

这里说说在几种数据结构中,mysql为什么选择hash,B+Tree

  1. 二叉树
  2. 红黑树
  3. hash
  4. BTree

首先,如果数据没有索引,那么我们读取数据是这样的

这里有一篇很好的硬盘存取原理文章,看完更容易理解: https://www.cnblogs.com/leezhxing/p/4420988.html 

上面我们发现读取数据特别耗时,那有没有比较节时的数据结构,我们可以看看二叉树 

 上面虽然优化了,但是mysql为什么选择 B+Tree

这里介绍一个动态演示数据结构的网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

二叉树与红黑树的比较

从上面我们发现,红黑树相比较于二叉树又进步了一些,但红黑树还是有些问题:那就是数据量大的话,红黑树的深度会很深,也就是说深度不可控,这样一来查找数据还是会很耗时

HASH

从上面我们发现,相比较于红黑树,hash可以固定“深度”,且映射到磁盘存储引用,这样查找数据直接告诉磁盘数据在哪,查找数据也挺快的,但是 hash 还是有些不足:那就是不能范围查找,比如我们查找Col1>1的数据,当然如果我们查询操作很少的话,我们也可以选择hash数据结构,因为它查找数据挺快的,这也是mysql的索引方法除了B+Tree还有hash

BTree

 从上面看,我们发现BTree又进步了一些,查询速度提高,存储容量也没影响到。当然有人可能会这样想,那我们为什么不把数据全部都存在一个节点,这样深度不就是1了吗?

当然不行了!java拿取数据一般是这样的:java程序-->CPU--->内存---->硬盘,而内存与硬盘的交互是有大小限制的,是一页数据4k左右,所以不能把所有数据都放在一个节点来获取,一般来说节点会尽量预存4K容量。

看到这里,我们知道(4K=节点;节点=小节点*小节点的容量)一个节点是4K,而节点内有几个小节点,那么也就是说,只要我们每个的小节点的data容量越小,那么可以存的节点也就可以更多。

B+Tree

B+Tree通过把data不放在非叶子节点来增加度(小节点),一般会一百个以上使得深度是3~5,从而减少查询次数。并且,叶子节点之间会有指针,数据又是递增的,这使得我们范围查找可以通过指针连接查找,而不再从上面节点往下一个个找。

结论:B+Tree 既减少查询次数又提供了很好的范围查询

 MyISAM索引实现(非聚集)

  MyISAM索引文件和数据文件是分离的,文章一开始也介绍了,数据.MYD+结构.frm+索引.MYI三个文件

 那myisam的索引是什么样的?

InnoDB索引实现(聚集)

  • 数据文件本身就是索引文件
  • 表数据文件本身就是按B+Tree组织的一个索引结构文件
  • 聚集索引-叶节点包含了完整的数据记录
  • 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
  • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

上面的问题对应字体颜色说明 (可能说的有些乱,可以参考这个的描述:https://baijiahao.baidu.com/s?id=1567647881305129&wfr=spider&for=pc) 

联合索引的底层存储结构

注意:

最左原则不能简单的理解为10002,staff,1995 (b,c,d) 这个顺序,

如果是 where  d = 1994 and b = 10002 ,这个依然会走索引,因为可以走b = 10002这个,然后在

这个结果集再筛选出 d = 1994

如果是  where c = staff and d = 1994 ,那么这个不走索引,因为上面的树无法判断走哪个节点(因为索引是根据 b 先排序的)

所以 最左原则 强调的是命中 b 字段

范围查询导致走索引失败

 

如果是 select * from table where b > 1,那么它可能先查出 b = 1,然后取出7个,这时mysql引擎发现走索引后,还要根据这7个的主键取出 * 字段 数据,那个它还不如走全表扫描(如下图),他遍历

8个数据的同时可以返回 * 字段数据,可能效率更快

如果是select * from table where b > 5 ,它走索引,因为mysql引擎发现>5只要取两个就行

总结:范围查询不一定导致索引失败,因为mysql优化器会优化,具体还是要用 explain看它的执行计划

练习题

在employee表建联合索引 (emp_no,title,from_date)

分析以下几条sql的索引使用情况

SELECT * from employee where emp_no = '10001' and title = 'xxx' and from_date = '2018-10-01 11:29:51'

SELECT * from employee where title = 'sss'

SELECT * from employee where emp_no > '10003'
 
SELECT * from employee where emp_no > '10003' and title = 'eeee'

SELECT * from employee where emp_no > '10003' ORDER BY title

#自己可以根据联合索引的数据结构猜猜看

也可以用explain来查看

【MySQL】深入理解MySQL索引底层数据结构与算法 索引是帮助MySQL高效获取数据的的。排好序这三个字其实就是对索引最好的形容和体现。我们可以简单把索引比喻成为书本的目录页,当然这么说太过于抽象,并没有把索引的底层特性说明白,下面我们将依次分析这些数据结构,来说明索引究竟是什么?! 阅读详情

相关推荐

联想拯救者r7000p在ubuntu20.04未找到wifi适配器,安装rtl8852ae网卡驱动问题解决方案

新买的拯救者r7000p 2021款,装完ubuntu20.04之后显示未找到wifi适配器, 更换N次源之后还是只有一个显卡驱动,在网上找了很多方法,再自己折腾了一段时间后,总算是解决了这个问题。 1.设置bios 打开主板系统,将security boot设置为disenable,因为设计到修改内核配置,必须得关掉安全启动。 2.查询网卡状态 使用命令查询网卡(hardware of Internet)状态 lshw -C network 因为是双系统,在Windows下控制面板-设备管理器中可以

MCZ777的博客 1万+

mysql底层数据结构

mysql数据结构

Aarstg的博客 2857

ZED2双目相机运行VINS-FUSION初试

基于ZED2运行VINS-MONO的经验,在运行VINS-FUSION前有几点tips想跟大家分享,应该能在运行的过程中避免一些踩坑吧。 TIPs 1)关于zed2标定 开始使用Kalibr进行相机单目/双目及联合标定,虽然重投影误差最高也就5个像素,但实际使用效果却并不好,故建议大家相机内参还是从ZED2相机发布出的topic获取或可尝试/usr/local/zed/settings文件下的参数文档 另,启动ZED2.launch的时候,会有一个相机(一般是左目)和IMU的轴系转换关系Camera-IMU

xiaojinger_123的博客 5356

mysql原理(1) mysql底层数据结构

一、前言 1.1 索引结构及查找算法 一个sql语句在mysql里究竟是如何运行的呢?又是怎么去查找的呢? 其中就涉及到数据库(存储数据)以及查找算法。 先来看一下几种查找算法; 目录查找:类似索引 遍历:暴力查找 二分:B+树的基础算法 键查找:hash查找 能做索引的数据结构有:数组、链表、红黑树、B树(B-树、B+树)。 那么哪种数据结构适合做 MySql 数据库的存储结构呢? 先来说下数据的一般存储方式:内存(适合小数据量)、磁盘(大数据量)。 磁盘的运转方式:速度 + 旋转,磁盘页

babyZeng 6212

STM32F103VCT6+W5500 TCP 服务端通信

STM32F103VCT6 W5500的TCP连接通讯的程序

坚韧与专注 7818

《C/C++等级考试(1~8级)历届真题解析》专栏总目录

中国电子学会《全国青少年软件编程等级考试》C/C++编程(1~8级)历届真题解析。订阅后可阅读专栏内所有真题解析,真题持续更新中!

人生就是一个不断学习的过程 2万+

Mysql数据结构

mysql底层数据结构,

lichaofan1的博客 4622

FPGA/IC秋招经典100题(含详解)

FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。

Crazzy_M的博客 1万+

Mysql底层数据结构学习总结

Mysql底层数据结构学习总结

weixin_45161367的博客 3428

[PCIE5.0] 2.2.8.9 Optimized Buffer Flush/Fill (OBFF) Message

这段文字讲解的是 优化的缓冲区清空/填充(OBFF)消息,它是 PCI Express(PCIe)规范中的一个可选功能,用于向设备报告平台中央资源的状态。简单来说,OBFF 主要帮助设备了解当前平台资源(如缓存或内存)的状态,从而优化数据的处理和传输。这章重点内容如下。

系统固件工程师 538

机器学习kaggle报告-Facial Keypoints Detection【完整解题过程+代码】

在处理面部关键点检测任务时,首先需要将存储在 CSV 文件中的图像数据转换为可以显示和分析的图像。数据集中每个图像是以一个一维数组的形式存储,其中包含了图像的所有像素值。为了将这些数据转化为实际的图像,我们需要按照一定的规则将这些像素值重新排列为一个二维矩阵(即图像的行列)。下面是一个案例,展示了如何将数据集中的图像数据转化为图片。转化过程读取CSV文件:首先,我们需要读取包含图像数据的 CSV 文件,通常该文件包含多张图像的像素值。每一行表示一张图像,并且包含图像的像素值列表。提取图像数据。

一键难忘的博客 3353

mysql的底层数据结构组成

定义:本身就是一种特殊的二叉树,每个节点上都有存储位表示节点的颜色,可以是red或black 约束:每个节点是黑色或者红色,根节点为黑色,叶子节点(特指空节点)是黑色,每个红色节点的子节点都是黑色的,任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同 特点:速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多余二倍。B树(B-tree)每个节点都存放了真实的数据,mysql一个根节点数据存储为16KB,会导致每一个节点存储的数据量变小,所以B树的高度会变高,维护的代价大,查询修改性能会越来越低。

m0_70208894的博客 1325

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入理解MySQL索引:底层数据结构与算法详解

在数据库操作中,磁盘I/O是一个关键的性能瓶颈。B+Tree通过减少磁盘访问来优化这一点,特别是在处理大量数据的查询时数据库索引常常需要处理范围查询(例如,查找某个区间内的所有记录)。B+Tree的结构使得这类查询非常高效由于叶子节点之间是相互连接的,B+树非常适合快速顺序访问数据,这在数据库中是一个常见需求B+Tree的内部节点不存储数据,这使得每个节点可以存储更多的键。这种结构也更加缓存友好,因为它允许更多的节点保留在内存中,减少了磁盘访问。

likunxing的博客 1813

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【MySQL】深入理解Mysql索引底层数据结构与算法

MySQL索引没有用B Tree,而是用B+Tree——B树的变种,有比B树更高的查询效率。

Mr_Wang_YF的博客 569

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

性能调优——14 深入理解MySQL索引底层数据结构与算法

索引数据结构详解、千万级数据表如何用B+树索引快速查找、聚集索引&聚簇索引&稀疏索引到底是什么?为什么DBA总推荐使用自增主键做索引?联合索引底层数据结构又是怎样的?Mysql最左前缀优化原则是怎么回事?索引失效怎么避免?

念头通达 1078

十四、深入理解Mysql索引底层数据结构与算法

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

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1376

《Mysql基础》-- 深入理解MySql索引底层数据结构与算法

深入理解MySql索引底层数据结构与算法 2021-05-16 10:59:06 一、索引本质 1、索引的本质 select * from t where col2 = 89 我们插入到数据表中的数据,有可能分布存储在磁盘不同的空间中,而我们的数据库查询的时候每次都要进行磁盘IO。当我们不加索引的时候,此时查询就是全表扫描,即一行一行的比对数据,多次进行磁盘IO,直到查询到我们所需的数据。 而我们所能想到的优化,自然是减少磁盘IO。而减少磁盘IO,我们自然是要减少数据比对的次数,.

lmj3732018的博客 9672
上一篇: Nginx 负载均衡演示之 upstream 参数 & location 参数
下一篇: Mysql的explain详解
caijunsen
博客等级 码龄10年 29粉丝 52原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值