Mysql第二关之存储引擎

news2024/12/29 10:49:13

简介

所有关于Mysql数据库优化的介绍仿佛都有存储引擎的身影。本文介绍Mysql常用的有MyISAM存储引擎和Innodb存储引擎,还有常见的索引。
Mysql有两种常见的存储引擎,MyISAM和Innodb,它们各有优劣,经过多次优化和迭代,现在常用的一般是Innodb引擎,因此MyISAM仅作基本介绍。

Innodb存储引擎

B+树结构

Mysql默认采用B+树存储结构,MyISAM也是采用B+树存储结构。然而,两者的不同在于,Innodb的叶子结点存储的数据,而MyISAM的叶子结点存储的索引。

在这里插入图片描述

聚簇索引和非聚簇索引

由于Innodb的叶子结点存储的实际数据,叶子结点又是B+树索引结构的一部分,因此这种将数据和索引结合起来的结构,我理解为聚簇索引。而没有将实际数据和索引结构结合起来的索引,理解为非聚簇索引。

聚簇索引:  实际数据是索引结构的一部分
非聚簇索引:实际数据不是索引结构的一部分

虽然MyISAM存储引擎也是B+树数据结构,但其叶子结点存储的数据地址,因此它属于非聚簇索引。
回到Innodb,由于实际数据是索引结构的一部分存储于物理介质之中,因此聚簇索引是唯一的,对于Innodb而言,一般主键索引是聚簇索引,如果未设置主键索引,为了保证Innodb的聚簇索引结构会自动生成主键。

主键索引与辅助索引

索引可以分为主键索引和辅助索引(二级索引)。

主键索引:主键索引的要求就是key的唯一性,对于Innodb而言是聚簇索引,对于MyISAM而言是非聚簇索引。

辅助索引:辅助索引都是非聚簇索引,因为这些索引都不包含实际的数据,只存储部分列值。它可以包含一列或多列,字符串前缀等等。
在这里插入图片描述

辅助索引的原理是将部分列重新构建为一个新的B+树结构,其叶子结点存放主键的ID,然后再通过主键ID回到主键索引中寻找实际的行数据,这个过程称为回表,从逻辑过程上来看,辅助索引一般情况下会查询两次B+树,其耗时会更长,因此在辅助索引优化过程中需要尽量减少回表次数。

如何减少回表次数?

是的,辅助索引的优化原则之一就是尽量减少回表次数,如果要减少回表次数就需要增加辅助索引的命中率。

在这里插入图片描述

根据辅助索引的特性,可以分为:
							普通索引
							联合索引
							覆盖索引
							前缀索引
  1. 普通索引和前缀索引
    之所以将它们放在一起,是因为它们具有共性。前缀索引是通过截取字符串前N个字符构成一个索引,普通索引是通过单列来构成。在构造这类索引时都需要考虑:

     每个索引数据的强唯一性
    

这样才能保证辅助索引命中率更高,回表次数更少。

  1. 联合索引
    普通索引和前缀索引都是通过单列数据来构建,而联合索引通过多列数据来构建。由于是多个列共同构建的索引,因此它的结构如下:

    在这里插入图片描述

     最左匹配原则:
     Mysql一直向靠右的列匹配,直到遇到范围查找(like、>、<、between)时停止。
    

如果要弄清最左匹配原则,需要明白联合索引的查找原理。

联合索引的查找原理:
联合索引构建时会生成一颗B+树,这颗B+树是有序的,它的排序规则为:

		左侧排序优先,当左侧相同时再排右侧。

在这里插入图片描述

  1. 覆盖索引
    如果查询的列值已经可以通过辅助索引得到,则不需要回表,这个称为覆盖索引。
    单列索引和联合索引都可以建立成覆盖索引。

B+树与Innodb的存储结构

B+树是Mysql底层的数据结构,其分为叶子结点和非叶子结点,最底层为叶子结点,上层为非叶子结点。通过从上至下的不断二分查找来快速定位。B树又称为Balanced Tree,属于平衡二叉树。

在这里插入图片描述

由于B树只具备随机查找特性,不具备连续查找特性,因此在B树上衍生出了B+树,其底层为双向链表。

在这里插入图片描述
当进行查询时,双向链表提供了顺序查询的基础。叶子结点和非叶子结点属于页结构,除了页结构,还有行、区、段、表空间等等。

存储结构由外到内:
	表空间 -> 段 -> 区 -> 页 -> 行

页是内存与磁盘交互的最小单位,16KB。 也就是说Innodb内存每次最少取一个叶子结点的数据,然后在内存中操作。
叶子结点中的页属于数据页。

explain关键字

通过explain关键字可以实现查询优化,explain关键字将会给出所列sql的执行信息,包括

id:语句执行顺序的序号
key:索引名称,如果为null,则没有索引
type: 访问类型,常见值有system、const、ref、range、index、all
rows: 扫描的行数

通过以上一些指标可以检测当前的sql语句执行效率如何。

MyISAM

MyISAM由于不支持事务、不支持行级锁、不支持数据容灾等特点,它更多适用于查询较多的情况。
它是非聚簇索引,叶子结点存放物理地址。拿到物理地址后再去数据堆里取数据。它的存储结构如下:
在这里插入图片描述

MYD: 存放实际数据
MYI: 存放索引结构
FMI: 存放表定义等

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

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

相关文章

【STM32 CubeMX】SPI HAL库编程

文章目录 前言一、CubeMX配置SPI Flash二、SPI HAL编程2.1 查询方式函数2.2 使用中断方式2.3 DMA方式 总结 前言 STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具&#xff0c;用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中&#xff0c;使用…

JDBC查询操作

目录 加载驱动获取连接创建会话发送SQL处理结果关闭资源测试 加载驱动 // 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");获取连接 // 获取连接String url "jdbc:mysql://127.0.0.1:3306/book";String username "root" …

2024全新领域,适合新手发展的渠道,年后不愁资金问题!

我是电商珠珠 如今年已经过完了&#xff0c;不少人还在迷茫自己开工后要做些什么&#xff0c;部分人还在想着去做一些不用吃力就能赚钱的工作&#xff0c;或是一份能兼顾自己日常生活的兼职。 其实&#xff0c;任何赚钱的工作要么动脑要么费力。 费力的工作有很多&#xff0…

敦煌网怎么提升流量的?如何进行自养号测评提升转化率?

敦煌网作为中国领先的跨境电商平台&#xff0c;对于商家而言&#xff0c;提升流量是增加曝光和销售的重要手段。以下将介绍敦煌网提升流量的几种方法。 一、敦煌网怎么提升流量的? 首先&#xff0c;通过合理的商品定位和市场调研&#xff0c;选择有潜力和竞争优势的商品进行…

android获取sha1

1.cmd在控制台获取 切换到Android Studio\jre\bin目录下执行keytool -list -v -keystore 签名文件路径例如&#xff1a; 2.也可以在android studio中获取 在Terminal中输入命令&#xff1a;keytool -list -v -keystore 签名文件路径获取 获取到的sha1如下&#xff1a;

linux系统zabbix工具监控web页面

web页面监控 内建key介绍浏览器配置浏览器页面查看方式 监控指定的站点的资源下载速度&#xff0c;及页面响应时间&#xff0c;还有响应代码&#xff1b; web Scenario&#xff1a; web场景&#xff08;站点&#xff09;web page &#xff1a;web页面&#xff0c;一个场景有多…

【LeetCode: 103. 二叉树的锯齿形层序遍历 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

OpenAl 视频生成模型 —— Sora技术报告解读

这里是陌小北&#xff0c;一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的&#xff0c;背诗的里面最会写段子的&#xff0c;写段子的里面代码写得最好的…厨子。 写在前面 早上醒来&#xff0c;就看到OpenAl推出的视频模型Sora炸锅了&#xff0c;感觉所…

WordPress站点成功升级后的介绍页地址是什么?

我们一般在WordPress站点后台 >> 仪表盘 >> 更新中成功升级WordPress的话&#xff0c;最后打开的就是升级之后的版本介绍页。比如boke112百科前两天升级到WordPress 6.4.2后显示的介绍页如下图所示&#xff1a; 该介绍除了介绍当前版本修复了多少个问题及修补了多少…

BUUCTF第十九、二十题解题思路

目录 第十九题rome 第二十题rsa 第十九题rome 解压、查壳。 无壳&#xff0c;用32位IDA打开&#xff0c;检索字符串&#xff0c;找到一个字符串“You are correct!”&#xff0c;与flag相关&#xff0c;对其交叉引用找到函数&#xff0c;查看伪代码。 int func() {int resul…

二叉树前序中序后序遍历(非递归)

大家好&#xff0c;又和大家见面啦&#xff01;今天我们一起去看一下二叉树的前序中序后序的遍历&#xff0c;相信这个对大家来说是信手拈来&#xff0c;但是&#xff0c;今天我们并不是使用常见的递归方式来解题&#xff0c;我们采用迭代方式解答。我们先看第一道前序遍历 1…

LabVIEW开发DUP实时监控系统

LabVIEW开发DUP实时监控系统 该项目采用虚拟仪器设计理念&#xff0c;以LabVIEW作为核心技术平台&#xff0c;开发了一套磁控溅射过程的实时监控系统。实现过程中关键参数的全面数据采集与处理&#xff0c;建立完整的历史数据库&#xff0c;以支持涂层技术的改进和系统向模糊控…

英文论文(sci)解读复现【NO.20】TPH-YOLOv5++:增强捕获无人机的目标检测跨层不对称变压器的场景

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

输入捕获模式PWM输入模式(PWMI)

一、概念介绍 输出比较&#xff1a; 比较电路输入的CNT、CCR大小关系 &#xff0c;在通道引脚输出高低电平 二、频率知识、测量方法补充 N/fc得到标准频率的时长&#xff0c;也就是待测频率的周期 测频法代码实现&#xff1a;修改对射式红外传感器计次&#xff08;上升沿计…

【Linux】管道文件 打包压缩 文本编辑器nano 进度条

目录 什么是管道文件&#xff1f; 打包和压缩 文本编辑器 nano的安装 nano的使用 退出nano编辑&#xff0c;ctrlx 普通用户无法sudo&#xff0c;该怎么解决 Linux小程序-进度条 预备知识 1.回车换行 2.缓冲区 准备工作 代码实现 1.processBar.h代码编写 2.main.c代…

优秀的电机驱动MCU:MM32SPIN360C

DC-DC电源布局注意点&#xff1a; 电源模块布局布线可提前下载芯片的datasheet&#xff08;数据表&#xff09;&#xff0c;按照推荐的布局和布线进行设计。 1) 芯片电源接近原则&#xff1a; 对于为芯片提供电压的开关电源&#xff0c;应确保它尽量靠近芯片放置。这样可以避…

一周学会Django5 Python Web开发-项目配置settings.py文件-资源文件配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计17条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

开关电源电路主要元器件基础知识详解

在学习电子电路过程中&#xff0c;电源我们无法绕开的一个重要部分&#xff0c;很多时候&#xff0c;故障就出现在电源部分&#xff0c;特别是开关电源。开关电源电路主要是由熔断器、热敏电阻器、互感滤波器、桥式整流电路、滤波电容器、开关振荡集成电路、开关变压器、光耦合…

使用 RAG 创建 LLM 应用程序

如果您考虑为您的文件或网站制作一个能够回应您的个性化机器人&#xff0c;那么您来对地方了。我可以帮助您使用Langchain和RAG策略来创建这样一个机器人。 了解ChatGPT的局限性和LLMs ChatGPT和其他大型语言模型&#xff08;LLMs&#xff09;经过广泛训练&#xff0c;以理解…

七天入门大模型 :大模型量化及低成本部署最佳实践

七天入门大模型已完成了5篇&#xff0c;喜欢记得收藏、关注、点赞。 七天入门大模型 &#xff1a;LLM大模型基础知识最全汇总七天入门大模型 &#xff1a;提示词工程 Prompt Engineering&#xff0c;最全的总结来了&#xff01;七天入门大模型 &#xff1a;LLM和多模态模型高效…