InnoDB存储引擎【MySQL从放弃到入门】

文章目录

  • InnoDB存储引擎【MySQL从放弃到入门】
    • 1.逻辑架构
      • 1.1 一条SQL语句是怎么执行的呢?
      • 1.2 MySQL存储引擎有哪些?
    • 2.MySQL一行记录是怎么存储的?
      • 2.1 NULL值是如何存储的?
    • 3.char和varchar的区别?
    • 4.数据页
    • 4.1 聚簇索引和非聚簇索引
    • 4.2 Buffer Pool
      • 4.2.1 什么是Buffer Pool?
        • 4.2.2 空闲页?
        • 4.2.3 脏页?
        • 4.2.4 缓存命中率咋样?脏页更新到磁盘时机呢?
          • 1.预读失效
          • 2.Buffer Pool污染
          • 3.脏页更新时机
        • 4.2.5 Buffer Pool可以代替Redis吗?
    • 4.3 Change Buffer

InnoDB存储引擎【MySQL从放弃到入门】

1.逻辑架构

1.1 一条SQL语句是怎么执行的呢?

[图片]

首先,MySQL的连接器会负责建立连接、校验用户身份、接收客户端的SQL语句;之后MySQL会在查询缓存中查找数据,但是在8.0版本移除了;其次MySQL的解析器会对SQL语句进行词法分析和语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;然后MySQL的优化器会基于查询成本的考虑,判断每个索引的执行成本,从中选择成本最小的执行计划;最后MySQL的执行器执行查询语句,从存储引擎读取记录,返回个客户端。

1.2 MySQL存储引擎有哪些?

我所了解的存储引擎有InnoDB、MyIsam、Memory。

(ps:那你知道MyIsam和InnoDB有什么区别吗?)

InnoDB在数据存储方面采用的是索引组织表,表数据和索引数据都存到同一个文件中(.frm&.ibd)。MyIsam采用的是堆表,数据和索引分开存储,因此表数据和索引数据会分开放在两个不同的文件中存储。

InnoDB引擎B+树叶子节点存储的是索引和数据,但是MyIsam存储的是索引和数据地址。另外,InnoDB支持行级锁和事务,但是MyIsam都不支持,只支持表级锁。

2.MySQL一行记录是怎么存储的?

表空间由段、区、页、行组成。

[图片]

2.1 NULL值是如何存储的?

[图片]

MySQL存储一行数据的时候,会使用上面这个格式进行存储,其中NULL值列表就是用来保存NULL值的。

MySQL行格式中会用NULL值列表来标记值为NULL的列,每个列对应一个二进制位,如果列的值为NULL,就标记这个位为1,否则为0,所以NULL值不会存储在行格式中的真实数据部分。

NULL列表最少会占用1字节空间,当表中所有列都定义为NOT NULL时,行格式中就不再需要NULL值列表,可以节省1字节空间。

总结,为什么说使用NULL值列表了,就可以节省空间?

就比如,一个字段varchar(200),但是是NULL,如果你不用标记位1来表示它为空,那么会给它分配最多200字节的空间,如果使用NULL列表,只需要1bit就可以表示它是NULL了,就不需要分配这个空间。

3.char和varchar的区别?

假如说一个字段是varchar(10),但它其实只有6个字节,那他内存中占的存储空间是多少?在文件中占的存储空间是多少?

答:内存会占用10字节,文件存储占6字节,并且额外用1-2字节存储可变长字符串长度的空间。(保存达到文件的时候,只会存储实际使用的字符串大小,但是内存会按varchar最大值固定分配大小。)
char是固定长度的字符串类型,它在系统中占用固定的存储空间,如果实际存储的字符串小于定义的长度,系统会自动用空格填充。

varchar是可变长的字符串类型,实际存储只占用实际字符串长度的空间,不会进行空格填充。

4.数据页

4.1 聚簇索引和非聚簇索引

聚簇索引和非聚簇索引的B+树有什么区别?

[图片]

聚簇索引和非聚簇索引最主要的区别就是B+树叶子节点存放的内容不同:

  • 聚簇索引的B+树的叶子节点存放的是主键值和完整的记录;
  • 非聚簇索引的B+树叶子节点存放的是索引值和主键值。

如果查询条件用到了二级索引,但是查询的数据不是主键值,也不是二级索引值,这时在二级索引找到主键值后,就需要回表才能查找到数据,需要扫描两次B+树。如果查询的是主键值,因为在二级索引就能查询到,但时候就会用到覆盖索引,不需要回表,只需要扫描一次B+树。

4.2 Buffer Pool

InnoDB对LRU做了哪些优化?

4.2.1 什么是Buffer Pool?

Buffer Pool就是MySQL为了提高查询性能的一个缓冲池,位于存储引擎层。默认innodb_buffer_pool_size=128MB。

InnoDB会为Buffer Pool申请一片连续的内存空间,然后按照默认的16kb的大小划分出一个个页,Buffer Pool中的页叫做缓存页。

[图片]

为了管理这些缓存页,InnoDB为每一个缓存都创建了一个控制块,这些控制块包括【缓存页的表空间、页号、缓存页地址、链表节点】等。

[图片]

4.2.2 空闲页?

Buffer Pool是一片连续的内存空间,但是在MySQL运行一段时间后,肯定有空闲的也有被使用的。那么这些空闲页怎么办?
我们下次读取磁盘数据的时候,是要遍历Buffer Pool找到一个空闲页吗?那也太浪费的吧。所以就为这些空闲页创建一个Free链表。

那么每当需要加载数据的时候,直接在Free链表拿一个就行。

4.2.3 脏页?

如果说我的缓存页被修改了,那么就直接更新我的磁盘吗?那也太拉低性能了吧。所以就设计了脏页,由后台线程去更新到磁盘好了。

那么怎么找这个脏页呢?那就创建一个链表吧,就叫Flush链表。

4.2.4 缓存命中率咋样?脏页更新到磁盘时机呢?

对于这个Buffer Pool来讲,我们当然希望访问次数多的一直留下,访问次数少的就给他移除。

那么就使用LRU算法,来实现这个功能,具体LRU是什么呢,可以看这篇文章。
https://blog.csdn.net/m0_73337964/article/details/144726361?spm=1001.2014.3001.5501

如果直接使用LRU算法的话,会出现两种问题预读失效和Buffer Pool污染。

1.预读失效

预读失效就是MySQL在访问数据时,会顺带给邻居也读出来,但是这些被提前读出来的邻居,并没有被访问,相当于这个预读白做了,这就是预读失效。

要避免预读失效带来的影响,最好就是让预读的页停留在Buffer Pool里的时间尽可能短,让真正被访问的页移动到LRU链表头部,从而保证真正的热数据留在Buffer Pool里的时间尽可能长。

MySQL将LRU链表分为了两个部分young和old区域。
[图片]

预读的页加载到old区域头部,当页真正被访问时,才将其加入到young区域头部。

2.Buffer Pool污染

当某一个SQL语句,在Buffer Pool比较有限的情况下,可能会将Buffer Pool里的所有页都替换出去,导致大量热数据被淘汰了,等这些热数据又被再次访问的时候,由于缓存未命中,就会产生大量的IO,这就是Buffer Pool污染。

MySQL的解决方案是,进入到young区域条件增加了一个停留在old区域的时间判断。

  • 如果后续的访问时间与第一次访问的时间在某个时间间隔内,那么该缓存页就不会被从old区域移动到young区域的头部。
  • 如果后续的访问时间与第一次访问的时间不再某个时间间隔内,那么该缓存页移动到young区域的头部。
    间隔时间默认为innodb_old_blocks_time=1000ms,也就是说只有同时满足被访问与在old区域停留时间超过1秒两个条件,才会被插入到young区域头部。
3.脏页更新时机
  1. 当redo log日志满了的情况下,会主动触发脏页刷新到磁盘;
  2. Buffer Pool空间不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,就先将脏页同步到磁盘;
  3. 空闲时,后台线程定期将适量的脏页刷入到磁盘;
  4. 关闭前,把所有脏页刷入到磁盘。
4.2.5 Buffer Pool可以代替Redis吗?

我觉得不能代替。

4.3 Change Buffer

推荐链接:09 普通索引和唯一索引,应该怎么选择?

原文章来自:揭开 Buffer Pool 的面纱

以上是我的阅读总结。

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

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

相关文章

Jenkins集成部署(图文教程、超级详细)

一、CI/CD 的概念 ​ CI/CD一般包含三个概念: 持续集成(Continuous Integration ,CI) 持续交付(Continuous Delivery) 持续部署(Continuous Deploy) ​ CI/CD 是现代软件开发的重要…

UE5喷涂功能

许多FPS/TPS 游戏都有喷涂、涂鸦功能 其实原理很简单,就是利用了延迟贴花实现的 我们从网上随便找一张图 创建一个材质,材质域选择延迟贴花 混合模式选择半透明,自发光强度可以看感觉调整 材质做好之后编译保存,新建一个Actor…

ECCV-2024 | 指令不够用、大模型来生成!BEVInstructor:基于BEV感知和大模型的视觉语言导航指令生成

作者:Sheng Fan, Rui Liu, Wenguan Wang, and Yi Yang 单位:浙江大学 原文链接:Navigation Instruction Generation with BEV Perception and Large Language Models (https://link.springer.com/chapter/10.1007/978-3-031-726…

电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决

电脑蓝屏是让许多用户头疼的问题,其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法,能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏,如金手指氧化、芯片…

Ubuntu下ESP32-IDF开发环境搭建

Ubuntu下ESP32-IDF开发环境搭建 文章目录 Ubuntu下ESP32-IDF开发环境搭建一、前言二、软件安装三、开发环境搭建3.1 ESP-IDF安装:3.2 安装编译工具: 四、编译并烧录代码五、ESP32代码编辑工具 一、前言 ​ 开发ESP32,我们首先就要安装开发环…

Linux复习4——shell与文本处理

认识vim编辑器 #基本语法格式: vim 文件名 •如果文件存在,进入编辑状态对其进行编辑 •如果文件不存在,创建文件并进入编辑状态 例: [rootlocalhosttest]# vim practice.txt #Vim 编辑器三种模式: 命令模式&a…

5个实用的设计相关的AI网站

在这个日新月异的数字时代,我们不断面临着新的挑战和机遇。随着人工智能(AI)技术的飞速发展,越来越多的AI工具开始融入到设计相关的工作流程中,极大地提升了工作效率和创作能力。今天,我非常兴奋地向大家介…

云手机群控能用来做什么?

随着云手机的发展,云手机群控技术逐渐从小众的游戏多开工具,发展为涵盖多个领域的智能操作平台。不论是手游搬砖、短视频运营,还是账号养成等场景,云手机群控都展现出了强大的应用潜力。本文将为大家详细解析云手机群控的应用场景…

数据结构(哈希表(中)纯概念版)

前言 哈希表(Hash Table)是计算机科学中的一个基础而重要的数据结构,它广泛评估各种算法和系统中,尤其是在需要快速查找、插入和删除操作的场景中。由于其O( 1)的平均时间复杂度,存储表在性能要求较高的应用中表现得非…

Python使用requests_html库爬取掌阅书籍(附完整源码及使用说明)

教程概述 本教程先是幽络源初步教学分析掌阅书籍的网络结构,最后提供完整的爬取源码与使用说明,并展示结果,切记勿将本教程内容肆意非法使用。 原文链接:Python使用requests_html库爬取掌阅书籍(附完整源码及使用说明…

水库大坝三维模型开发bim篇

效果图 开发过程 使用了bimface 插件上传做好rvt模型到bimface工程引入bimface相关的插件代码加载模型自定义目录树定位构件闪烁构件展示构件信息 代码 技术交流加V:bloxed appKey 和appSecret 换成自己的就行 <template><div class"box-bim w100" ref&…

CSharp: Oracle Stored Procedure query table

存储过程查询postgreSQL,Oracle 和sql server,Mysql 有区别。程序调用也是有区别。 oracle sql script: CREATE OR REPLACE PROCEDURE procSelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId p…

C语言基础——指针(4)

一&#xff0e; 字符指针变量 字符指针变量的使用和整型指针变量的使用方法相似&#xff0c;以下是其基本使用方法的例子&#xff1a; &#xff08;1&#xff09;字符指针变量还有一种使用方法&#xff1a; const char* p "abcd" 需…

Net9解决Spire.Pdf替换文字后,文件格式乱掉解决方法

官方文档 https://www.e-iceblue.com/Tutorials/Spire.PDF/Program-Guide/Text/Find-and-replace-text-on-PDF-document-in-C.html C# 在 PDF 中查找替换文本 原文件如下图&#xff0c;替换第一行的新编码&#xff0c;把41230441044替换为41230441000 替换代码如下&#xff…

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…

【自动化测试】windows下安装Selenium浏览器界面测试工具

Date: 2024.12.23 10:15:53 author: lijianzhan 简述&#xff1a;这篇教程详细介绍了如何在Windows环境下安装selenium&#xff0c;并设置Chrome浏览器驱动。什么是Selenium&#xff1f;Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端…

前端网络之【浏览器跨域问题分析与解决方案】

文章目录 同源策略同源与异源跨域的限制场景解决方案 CORS 请求分类 简单请求预检请求 注意点一 【关于Cookie】注意点二 【关于跨域获取响应头】 JSONP 基本流程 代理服务器 如何选择对应方案 同源策略 **同源策略是一套浏览器的安全策略机制&#xff0c;当一个源的文档和脚…

老旧小区用电安全保护装置#限流式防火保护器参数介绍#

摘要 随着居民住宅区用电负荷的增加&#xff0c;用电安全问题日益突出&#xff0c;火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备&#xff0c;能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…

论文复刻:ESG表现对企业价值的影响机制研究——A股上市公司证据(2009-2023年)

参照王波&#xff08;2022&#xff09;的做法&#xff0c;对来自软科学《ESG表现对企业价值的影响机制研究——来自我国A股上市公司的经验证据》一文中的基准回归部分进行复刻 以中国2009-2023年A股上市公司为研究样本考察企业的环境、社会和治理&#xff08;ESG&#xff09;表…

小程序租赁系统开发指南与实现策略

内容概要 在如今这个快节奏的时代&#xff0c;小程序租赁系统的开发正逐渐成为许多商家提升服务质量与效率的重要选择。在设计这样一个系统时&#xff0c;首先要明白它的核心目标&#xff1a;便捷、安全。用户希望在最短的时间内找到需要的物品&#xff0c;而商家则希望通过这…