MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用

news2024/11/28 10:59:33

数据结构

我们知道MySQL的存储引擎Innodb默认底层是使用B+树的变种来存储数据的

下面我们来复习一下B树存储 + B树存储  + 哈希存储的区别

哈希存储,只能使用等值查询

B树与B+树存储

我们知道B+树实际上就是B树的变种

那么为啥使用B+树而不是使用B树呢?

我们知道效率的高低主要取决于load进内存的时候这个load操作的次数

注:数据表中的数据只是逻辑上连续的,在物理内存中其实是不连续的

因为我们知道磁盘是一圈一圈的,磁头是一直在读写的

可能两次读写之间根本不在一个磁道中

我们先看看B树的数据结构

假设这里我们向查找一个9号数据,我们内存中就会加载这里的根节点,以二分查找的方式开始查找9,但是这里的查找由于一层存放的节点是带有数据的,相对来说存放相同的数据的节点数就会少,对应的层数也就升高了,所以MySQL决定使用了B树的变种,B+树,B+树只在叶子结点存储数据,这样同一层能存储的数据就多了,虽然每一层都会使用一个冗余节点,但是内存开销也是很小的

一个叶节点最大16K(默认)

假设对于一个千万级的数据,对于B+树只需要三层,对于B树却需要远超3层的一个指数级节点数,而且对于范围查找也是B+树更擅长的,因为B+树在叶子节点之间之间放了一个双向指针,而且是排好序的数据,更方便查找范围数据

注:其实也可以选择使用hash结构存储,但是hash存储是不能解决范围查找的问题的,所以还是B+树更优

索引

索引的定义:索引是帮助mysql高效获取数据的排好序的数据结构

以上的定义对于理解索引的操作非常重要

对于根节点来说,其是常驻内存的

我们知道对于表规范来说我们应该在设计表的时候加上id  开始时间  更新时间

通常id设置为整形自增主键  

为啥是自增主键呢??

选择整形是因为其占用的内存小,相对来说查找较快  以前使用uuid占用内存就比较大

自增是为了不导致树的平衡和节点拆分操作

我们举个例子

假设我先插入7 再插入 8 可能就是对树的大节点进行拆分,还对树进行了平衡操作,效率降低了

所以这里建议使用自增主键

相对来说使用自增主键的效率更高

二级索引

我们知道对于mysql还有二级索引

那么二级索引又是怎么存储的呢?

二级索引的索引树叶子节点存储的就是索引信息和主键信息

对于二级索引索引树包含的信息使用它会更快

但是一旦超出的他的数据范围,就需要一个回表的操作了

因为二级索引树的信息不能包含所有的信息

只能根据其主键来去主键的索引树查询了

这样来说效率反而会降低,不如直接使用主键索引树的聚集查询

explain工具

我们知道explain关键字可以查询到sql语句中对应的sql执行信息,方便我们进行sql的优化

下面我们来介绍一下有关的信息

1.select_type   语句的复杂程度

一般有三种

simple   sqlquery子查询   derived延伸查询 

延伸查询是在from后面临时生成的临时表

2.partitions   

分区  一般不使用

对于数据多的直接使用分库分表了

3.type   

可以查看估算到sql语句执行的效率

下面我们来一个一个介绍一下这里的表示

1.system 

 表示这个表只有一个字段,使用唯一索引直接就查找到了

2.const 

表示查找的时候使用唯一索引   就跟查询一个常量一样快

我们可以理解为system是const 的一个特殊情况

system的数据更少

3.eq_ref

equal_reference 表示连接的时候使用主键索引

这时候因为使用了唯一性索引就出来不需要比较

4.ref 

在连接的时候没有使用唯一性索引

但是使用了索引可能使用了二级索引等等

查出来可能是多条数据要进行比较

5.range

范围查找  

使用主键索引来检索给定范围的行

因为是有序的,还是能使用索引的

6.index

全索引扫描   

这里使用的是二级索引进行范围查找

7.all 

效率最低的全表扫描

不使用索引

key_len

这里表示的就是使用联合索引的哪个字段

比如说使用了int类的字段就是4表示4个字节...

extra

额外信息

这里说几个常见的

Using index 

使用覆盖索引

这里的覆盖索引指的不是一种索引 而是一种查找索引的方式

这里就是表示二级索引的索引树叶子节点已经包含了全部信息

这里就无需再进行回表使用主键索引树继续查找了

Using where 

查询的列没被索引覆盖

Using index condition

用到了临时表  比如使用了distinct进行去重 ,这里如果用到索引树就直接去拿

没用到索引树就得创建一个临时表

Using filesort

使用外部排序   在orderby的时候会出现   

如果没使用索引就会出现外部排序

这里使用临时表和外部排序的都需要被优化掉,使用索引去覆盖即可

使用全值索引更快

顺序换了一下也会走索引,但是最好不要,因为mysql底层会进行一定程度的运算,会降低效率

注:不要在索引上做一些运算操作,因为这样会导致索引树无法定位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】作用域和闭包

作用域 作用域是程序源代码中定义的范围。JavaScript采用词法作用域,也就是静态作用域。所谓词法作用域就是在函数定义的时候就已经确定了。 let value 1 function foo(){console.log(value) } function bar(){let value 2foo() } bar() // 1变量对象是当前代码…

2.基础乐理-唱名的来历,简谱的构造

前置内容:1.唱名与记住唱名的方法 唱名的来历: 很久很久以前(公元前)各个文明开始诞生和慢慢发展,随着文明的发展,各个文明都开始出现自己的音乐,根据考古学家的发现在 公元前1800年&#xff…

【随笔】Git 高级篇 -- 整理提交记录(下)rebase(十六)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

每日汇评:地缘冲突休战会阻碍黄金创纪录的涨势吗?

尽管以色列与哈马斯的地缘政治紧张局势有所缓和,金价仍冲破 2350 美元,创下新高; 对央行黄金购买量激增的预期抵消了美国非农就业数据主导的美联储强硬押注; 在美国CPI数据公布之前,由于 RSI 极度超买,金价…

YOLOV8注意力改进方法: CoTAttention(Visual Question Answering,VQA)附改进代码)

原论文地址:原论文下载地址 论文相关内容介绍: 论文摘要翻译: 具有自关注的Transformer导致了自然语言处理领域的革命,并且最近在许多计算机视觉任务中激发了具有竞争性结果的Transformer风格架构设计的出现。然而,大…

day02php环境和编译器—我耀学IT

一、环境介绍 1、web 环境 使用 PHP 需要先安装环境,安装环境比较麻烦,需要安装Web服务、PHP应用服务器、MySQL管理系统。 Web服务:apache 和 nginx PHP:多版本 MySQL:多版本 2、环境集成包 因为多环境、多版本、多系…

查看Linux系统相关信息

注: 本文只是博主学习记录分享,仅供参考。如有错误肯定是博主理解有问题,谢谢! 一、查看当前操作系统的内核信息 命令:uname -a 二、查看当前操作系统版本信息 命令:cat /proc/version 这条命令可以查看到…

什么是电子邮件加密?电子邮件加密有几种类型?

在当今数字时代,电子邮件已经成为人们日常生活中不可或缺的沟通工具,据相关数据统计,全球每天发送的电子邮件数以亿计,而这些邮件里面通常包含了姓名、地址、个人身份信息 (PII)、登录凭证、财务信息、法律合同、知识产权等有价值…

Python学习从0到1 day22 第二阶段 面向对象 ⑤ 多态

诋毁本身就是一种仰望 —— 24.4.8 学习目标 1.理解多态的概念 2.理解抽象类(接口的编程思想) 多态 多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态 多态常用在继承关系上 比如&am…

从事「音视频领域」开发工作有前途吗?

据我所知,做音视频的也分算法和工程,这两者都比普通开发高出不少,音视频工程开发的薪资大概比普通web开发高出30%。在开始前我有一些资料,是我根据网友给的问题精心整理了一份「音视频开发的资料从专业入门到高级教程」&#xff0…

使用 AI 生成正则表达式,告别正则烦恼

如果你有处理正则表达式的需求,那么这个网站(autoregex.xyz)一定要收藏好。 可以根据文字描述生成正则表达式。 默认是从文字到正则,不用选择。 输入框中输入描述,点击 ”GO“ 按钮。 等待一会儿,即可生…

计算 Hermitian 矩阵的特征值和特征向量 cusolver 示例 DnCheevj

1,原理 计算Hermitian 矩阵的特征值,使用Jacobi 旋转法,每次调整两个对称元素为0,通过迭代,使得非对角线上的值总体越来越趋近于0. 示例扩展了 nv 的 cusolverDsyevj 的示例 由于特征向量是正交的,故V*V…

预训练任务

预训练任务 - Mask Language Model jieba预分词长度小于4的词直接mask&#xff08;mask_ids就是input_ids&#xff09; if rands > self.mask_rate and len(word) < 4:word word_list[i]word_encode tokenizer.encode(word, add_special_tokensFalse)for token in wo…

Leetcode面试经典150_Q122买卖股票的最佳时机II

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

快速为App打造Android端聊天室,节省80%开发成本(一)

前言 环信 ChatroomUIKit 提供 UIKit 的各种组件&#xff0c;能帮助开发者根据实际业务需求快速搭建聊天室应用&#xff0c;有效节约开发成本&#xff01;通过该 UIKit&#xff0c;聊天室中的用户可实时交互&#xff0c;发送普通弹幕消息、打赏消息和全局广播等功能。 本文详…

紫叶写作能用吗 #微信#知识分享

紫叶写作是一款非常好用、靠谱的论文写作工具&#xff0c;它旨在帮助用户快速高效地完成论文写作任务&#xff0c;并提供查重降重的功能。它不仅操作简单方便&#xff0c;而且功能强大&#xff0c;能够有效提高论文写作的效率和质量。 首先&#xff0c;紫叶写作提供了丰富的模板…

10款白嫖党必备的ai写作神器,你都知道吗? #媒体#人工智能#其他

从事自媒体运营光靠自己手动操作效率是非常低的&#xff0c;想要提高运营效率就必须要学会合理的使用一些辅助工具。下面小编就跟大家分享一些自媒体常用的辅助工具&#xff0c;觉得有用的朋友可以收藏分享。 1.飞鸟写作 这是一个微信公众号 面向专业写作领域的ai写作工具&am…

jmeter压测websocket协议

一、jmeter 安装websocket插件 1、选项--插件管理 2、搜索WebSocket Samplers by Peter Doornbosch插件 进行安装 3、 重启 jmeter 二、jmeter压测websocket协议实战 2.1、以网站为例&#xff1a; websocket在线测试 1、断开连接 2、打开F12&#xff0c;查看WS数据 3、…

基于Socket简单的UDP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 网络编程前言 网络编程是连接数字世界的桥梁&#xff0c;它让计算机之间能够交流信息&#xff0c;为我们的生活和工作带来便利…

电路基础-电容-电感

电路基础 电容 通交流阻直流&#xff0c;滤波&#xff0c;旁路&#xff0c;退耦&#xff0c;作驱动电源&#xff08;洗衣机电机启动时需要一个强电启动&#xff09; 电容选型的工程值&#xff1b;参考以往开发板的选型&#xff1b;抄作业。 电源并连多个电容的作用 保证单…