Mysql第二关之存储引擎

简介

所有关于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.hqwc.cn/news/473673.html

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

相关文章

数据结构对链表的初步认识(一)

已经两天没有更新了&#xff0c;今天就写一篇数据结构的链表吧&#xff0c;巩固自己也传授知识&#xff0c;不知道各位是否感兴趣看看这一篇有关联表的文章。 目录 链表的概念与结构 单向链表的实现 链表各个功能函数 首先我在一周前发布了一篇有关顺序表的文章&#xff0c;…

漏洞原理 | CORS跨域学习篇

本文由掌控安全学院 - 帆先生 投稿 0x01&#xff1a;原理 1、 什么是CORS 全称跨域资源共享&#xff0c;用来绕过SOP(同源策略)来实现跨域访问的一种技术。 CORS漏洞利用CORS技术窃取用户敏感信息 2、 同源策略简介 同源策略是浏览器最核心也是最基本的安全功能&#xff0…

Netty中的内置通信模式、Bootstrap和ChannelInitializer

内置通信传输模式 NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性&#xff0c;如果SO_REUSEPORT&#xff0c;比NIO传输更快&#xf…

layui表格中使用cascader后导致表格滚动条消失

修改前&#xff0c;受影响页面 修改后最终想要的效果 修改方法

TIM编码器接口(编码器测速)

定时器编码器接口自动计次--------->对应手册14.3.12编码器接口模式 应用场景&#xff1a; 电机控制PWM驱动电机&#xff0c;编码器测电机速度&#xff0c;PID算法闭环控制 ------------------------------------------------------------------------------------------…

Java IO详解

一、流的概念与作用 流(Stream)&#xff1a; 在Java IO中&#xff0c;流是一个核心的概念。流从概念上来说是一个连续的数据传输过程。人们根据数据传输特性将流抽象为各种类&#xff0c;方便更直观的进行数据操作。你既可以从流中读取数据&#xff0c;也可以往流中写数据。流的…

计算机毕业设计SSM基于的高校学习资源共享系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; vue mybatis Maven mysql5.7或8.0等等组成&#xff0c;B…

Camtasia2023破解版下载

Camtasia2023破解版是一款简单好用的屏幕录像软件&#xff0c;它结屏幕录制和录制视频编辑等功能于一身&#xff0c;不管是用来创建视频教程还是相关教学视频或者操作演示等都是不二的选择&#xff0c;软件支持录制全屏或者部分区域进行选择录制&#xff0c;可录制网络摄像头、…

DTAN: Diffusion-based Text Attention Network for medical imagesegmentation

DTAN:基于扩散的医学图像分割文本关注网络 摘要 在当今时代&#xff0c;扩散模型已经成为医学图像分割领域的一股开创性力量。在此背景下&#xff0c;我们引入了弥散文本注意网络(Diffusion text - attention Network, DTAN)&#xff0c;这是一个开创性的分割框架&#xff0c…

第五节笔记:LMDeploy 大模型量化部署实践

大模型部署背景 参数用FP16半精度也就是2字节&#xff0c;7B的模型就大约占14G 2.LMDeploy简介 量化降低显存需求量&#xff0c;提高推理速度 大语言模型推理是典型的访问密集型&#xff0c;因为是decoder only的架构&#xff0c;需要token by token的生成&#xff0c;因…

【数据结构排序算法篇】----基数排序【实战演练】

作为一名对技术充满热情的学习者&#xff0c;我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代&#xff0c;我远非专家&#xff0c;而是一位不断追求进步的旅行者。通过这篇博客&#xff0c;我想分享我在某个领域的学习经验&#xff0c;与大家共同探讨、共…

鸿蒙语言ArkTS(更好的生产力与性能)

ArkTS是鸿蒙生态的应用开发语言 ArkTS提供了声明式UI范式、状态管理支持等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发应用。 同时&#xff0c;它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;进一步通过规范强化静态检…