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

数据结构

我们知道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.rhkb.cn/news/301349.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)

一、前言 目前有一个关于通过STM32F411CEUx的I2S总线接口控制SSS1700芯片进行音频输入输出的研究。 SSS1700 是具有片上振荡器的 3S 高度集成的USB音频控制器芯片 。 SSS1700 功能支持96 KHz 24 位采样率,带外部音频编解码器(24 位/96KHz I2S 输入和输出…

可视化大屏 附源码(Vue3 + TS + DataV + ECharts)

目录 前言 ✨项目代码 1、带有node_modules的项目包 🚀 2、不带有node_modules的项目包 🚀 ⚒️项目屏幕大小调整 💎 使用开源项目 1、DataV 🔰 2、Echarts 🔰 3、PPchart 🔰 4、表格平滑滚动 &a…

Day82:服务攻防-开发组件安全Solr搜索Shiro身份Log4j日志本地CVE环境复现

目录 J2EE-组件Solr-本地demo&CVE 命令执行(CVE-2019-17558) 远程命令执行漏洞(CVE-2019-0193) Apache Solr 文件读取&SSRF (CVE-2021-27905) J2EE-组件Shiro-本地demo&CVE CVE_2016_4437 Shiro-550Shiro-721(RCE) CVE-2020-11989(身…

vue3+<script setup>+element-plus中Calendar 日历打点

<template><el-calendar><template #date-cell"{ data }"><p :class"data.isSelected ? is-selected : ">{{ data.day.split("-").slice(1).join("-") }}{{ data.isSelected ? "✔️" : "&q…

如何搭建企业级MQ消息集成平台

企业级MQ消息集成平台的重要性在于实现不同系统之间的高效、可靠、实时的消息传递和数据交换。它可以帮助企业实现系统解耦&#xff0c;提高系统的可扩展性和灵活性&#xff0c;降低系统间的依赖性。通过消息队列中间件&#xff0c;企业可以实现异步通信、削峰填谷、流量控制等…

LabVIEW数控磨床振动分析及监控系统

LabVIEW数控磨床振动分析及监控系统 在现代精密加工中&#xff0c;数控磨床作为关键设备之一&#xff0c;其加工质量直接影响到产品的精度与性能。然而&#xff0c;磨削过程中的振动是影响加工质量的主要因素之一&#xff0c;不仅会导致工件表面质量下降&#xff0c;还可能缩短…

阿里云服务器可以干什么?阿里云服务器主要用途是干嘛的?

阿里云服务器可以干嘛&#xff1f;能干啥你还不知道么&#xff01;简单来讲可用来搭建网站、个人博客、企业官网、论坛、电子商务、AI、LLM大语言模型、测试环境等&#xff0c;阿里云百科aliyunbaike.com整理阿里云服务器的用途&#xff1a; 阿里云服务器活动 aliyunbaike.com…

【JavaWeb】Day32.SpringBootWeb请求响应——分层解耦(二)

3.IOC&DI 3.1 IOC&DI入门 完成Controller层、Service层、Dao层的代码解耦 思路&#xff1a; 1. 删除Controller层、Service层中new对象的代码 2. Service层及Dao层的实现类&#xff0c;交给IOC容器管理 3. 为Controller及Service注入运行时依赖的对象 Controller程序…

在自定义数据集上微调 YOLOv9 模型

在自定义数据集上微调 YOLOv9模型可以显着提高目标检测性能,但这种改进有多显着呢?在这次全面的探索中,YOLOv9在SkyFusion数据集上进行了微调,分为三个不同的类别:飞机、船舶和车辆。通过一系列广泛的实验,包括修改学习率、图像大小和战略性冻结主干网,已经实现了令人印…

libVLC 提取视频帧使用QWidget渲染

在前面的文章中&#xff0c;我们使用libvlc_media_player_set_hwnd设置了视频的显示的窗口。 libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow->winId()); 如果我们想要提取每一帧数据&#xff0c;将数据渲染到QWidget上&#xff0c;该如何操作呢&a…

vulhub中Apache Solr Velocity 注入远程命令执行漏洞复现 (CVE-2019-17558)

Apache Solr 是一个开源的搜索服务器。 在其 5.0.0 到 8.3.1版本中&#xff0c;用户可以注入自定义模板&#xff0c;通过Velocity模板语言执行任意命令。 访问http://your-ip:8983即可查看到一个无需权限的Apache Solr服务。 1.默认情况下params.resource.loader.enabled配置…

springboot实现上传文件接口(简单版)

使用springboot实现一个最简单版本的上传文件接口 private String uploadPath "C:/imageFiles";RequestMapping(value "/upload", method RequestMethod.POST)private Result upload( RequestParam("modelName") String modelName,RequestPar…

精酿啤酒的未来:创新与传统的碰撞

随着精酿啤酒的兴起&#xff0c;越来越多的人开始关注这一领域的发展趋势。精酿啤酒作为啤酒中的一种新兴类别&#xff0c;其未来发展将受到创新与传统的碰撞和影响。在这其中&#xff0c;Fendi Club啤酒屋作为精酿啤酒的代表性场所&#xff0c;将继续发挥其重要的作用。 首先&…

Synchronized 同步锁

synchronized 它可以把任意一个非 NULL 的对象当作锁。他属于独占式的悲观锁&#xff0c;同时属于可重入锁。 Synchronized 作用范围 ● 作用于方法&#xff0c;锁住的是对象实例&#xff08;this&#xff09; ● 当作用于静态方法时&#xff0c;锁住的是 Class 实例&#xf…

鸡乐盒网页版

前端时间鸡乐盒比较火&#xff0c;当时跟着做了一款鸡乐盒&#xff0c;同时拥有聊天以及音乐播放器功能 链接&#xff1a; 鸡乐盒https://www.jaron.top/app/xiana/pages/musicBox/musicBox

每日OJ题_两个数组dp①_力扣1143. 最长公共子序列

目录 力扣1143. 最长公共子序列 解析代码 力扣1143. 最长公共子序列 1143. 最长公共子序列 难度 中等 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样…

SpringCloud Alibaba @SentinelResource 注解

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十五篇&#xff0c;即介绍 SpringCloud Alibaba 的 SentinelResource 注解。 二、简介 这个注解用于标…

一切皆是为了交流-DDD通用语言

通用语言是什么&#xff1f; 通用语言是一种在特定领域内的沟通方式&#xff0c;可以由文字、语言、手势、图像等一切与达到沟通目的的元素组成。 比如&#xff0c;在中国内&#xff0c;方言是闽南的小王与方言是粤语的小张进行交流&#xff0c;那么&#xff0c;普通话是他们…

item_get_app在竞品分析中的应用与效果评估

item_get_app作为淘宝开放平台的重要API接口&#xff0c;为商家在竞品分析中提供了强大的数据支持。在竞争激烈的电商市场中&#xff0c;竞品分析是商家不可或缺的一环&#xff0c;而item_get_app的应用则使得这一分析过程更加高效、精准。通过调用item_get_app接口&#xff0c…