【MySQL】

这里写目录标题

  • MySQL架构
  • 一条sql执行流程
  • MySQL数据存放电脑位置
  • ibd文件结构
  • 行溢出是什么
  • MySQL行记录存储格式

MySQL架构

MySQL 的架构共分为两层:Server 层存储引擎层

Server层
Server 层主要负责建立连接、分析和执行 SQL。MySQL 里大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数和所有跨存储引擎的功能比如存储过程、触发器等都在 Server 层实现。

存储引擎层
存储引擎层主要负责数据的存储和提取。MySQL支持多个存储引擎,不同的存储引擎共用一个 Server 层。从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。

一条sql执行流程

在这里插入图片描述

第一步:通过连接器进行连接
我们首先需要连接 MySQL 服务器,然后才能执行 SQL。因为 MySQL 是基于 TCP 协议进行传输的,所以连接的过程需要先经过 TCP 的三次握手。
第二步:查询缓存
如果 SQL 是查询语句,MySQL 就会先去缓存里查找缓存数据,看看之前有没有执行过这一条命令,这个查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。
如果查询的语句命中查询缓存,那么就会直接返回 value 给客户端。如果查询的语句没有命中查询缓存中,那么就要往下继续执行,等执行完后,查询的结果就会被存入查询缓存中。

但其实对于更新比较频繁的表,查询缓存的命中率很低的,因为只要一个表有更新操作,那么这个表的查询缓存就会被清空。如果刚缓存了一个查询结果很大的数据,还没被使用的时候,刚好这个表有更新操作,查询缓冲就被清空了,那这样也太浪费资源了。所以,MySQL 8.0 版本直接将查询缓存删掉了。

第三步:解析器解析 SQL
在正式执行 SQL 查询语句之前, MySQL 会先对 SQL 语句做解析,这个工作交由「解析器」来完成。
解析器会做如下两件事情。

1,词法分析。MySQL 会根据你输入的字符串识别出关键字,比如表名、字段名、where条件这些,并且构建出 SQL 语法树。
2,语法分析。也就是检验我们输入的 SQL 语句语法是否正确,比如把 from 写成了 form,这时 MySQL 解析器就会报错。

第四步:执行SQL
SELECT 查询语句流程主要可以分为三个阶段:

1、预处理阶段
检查 SQL 查询语句中的表或者字段是否存在;把 select* 中的 * 符号,扩展为表上的所有列;
2、优化阶段
优化器主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。
3、执行阶段
根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;

MySQL数据存放电脑位置

默认是在 /var/lib/mysql/ 目录里,一个xx数据库目录下有三个文件

db.opt, 用来存储当前数据库的默认字符集和字符校验规则。
xx.frm,用来存储结构,每建立一张表都会生成一个.frm 文件。
xx.ibd,用来存储数据,每一张表的数据都存放在一个独立的 .ibd 文件。

ibd文件结构

表空间由行、页、区、段组成。
1、行
数据库表中的记录都是按行进行存放的,每行记录根据不同的行格式,有不同的存储结构。
2、页
虽然记录是按照行来存储的,但是数据库的读取并不以行为单位,因为如果每次只能处理一行数据,效率会非常低。所以,InnoDB 的数据是以「页」为单位来读写的。每当需要读一条记录的时候,会把包含这条记录的整个页从磁盘读入内存。
页是 InnoDB 存储引擎磁盘管理的最小单元,它默认的大小是16KB,所以数据库每次读写都是以 16KB 为单位的。
3、区
4、段

行溢出是什么

MySQL 中磁盘和内存交互的基本单位是页,一个页的大小一般是 16KB,也就是 16384字节,而一个 varchar(n) 类型的列最多可以存储 65532字节,一些大对象如 TEXT、BLOB 可能存储更多的数据,这时一个页可能就存不了一条记录。这个时候就会发生行溢出,多的数据就会存到另外的「溢出页」中。

MySQL行记录存储格式

InnoDB 提供了 4 种行格式,分别是 Redundant、Compact、Dynamic和 Compressed 行格式。
1、Redundant
Redundant是MySQL5.0之前使用的格式,现在已经废弃了。
2、Compact
这个比较经典,后面的Dynamic和Compressed 都是基于Compact改造而来的。
在这里插入图片描述
在compact行格式下,一行记录分为两个部分:额外信息和真实数据。
额外信息
额外信息包含 3 个部分:变长字段的长度列表、NULL 值列表、记录头信息

变长字段的长度列表主要是存储变长字段所占用的数据大小,然后读取的时候可以根据这个长度列表来读取对应的数据长度。它在存储时是按照列的逆序来存放的。之所以要逆序,是因为记录头信息中指向下一个记录的指针,指向的是下一条记录的「记录头信息」和「真实数据」之间的位置,这样的好处是向左读就是记录头信息,向右读就是真实数据,比较方便。
如果表里没有变长字段,那行格式就不会有变长字段长度列表。

NULL 值列表:因为表中的某些列可能会存储 NULL 值,如果把这些 NULL 值都放到记录的真实数据中会比较浪费空间,所以 Compact 行格式把这些值为 NULL 的列存储到 NULL值列表中。如果列是NULL,那就给它对应值为1的二进制位。如果列值不是NULL,就给它一个0的二进制位。存放时也是逆序存放。
当数据表的字段都定义成 NOT NULL 的时候,这时候表里的行格式就不会有 NULL 值列表了。

记录头信息:包含比较多的东西,比如delete_mask 标识这条数据是否被删除。next_record下一条记录的位置等等。

真实数据
记录真实数据部分除了我们定义的字段,还有三个隐藏字段,分别为:row_id、trx_id、roll_pointer。
如果表里既没有指定主键,又没有唯一约束,那么 InnoDB 就会为记录添加 row_id 隐藏字段,占六个字节。
trx_id是事务id,表示这个数据是由哪个事务生成的,占6个字节。
roll_pointer,这条记录上一个版本的指针。roll_pointer 是必需的,占 7 个字节。

Dynamic
Compressed 和 Dynamic 这两个行格式和 Compact 非常类似,主要的区别在于处理行溢出数据时有些区别。
Compact 在行溢出时,会在记录的真实数据处只会保存该列的一部分数据,而把剩余的数据放在「溢出页」中,然后真实数据处用 20 字节存储指向溢出页的地址,从而可以找到剩余数据所在的页。
而Compressed 和 Dynamic 在行溢出时,记录的真实数据处只存储 20 个字节的指针来指向溢出页,而实际的数据全都存储在溢出页中。

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

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

相关文章

后端开发2.mongdb的集成

使用docker安装 安装 拉取镜像 docker pull mongo:4.4.14-focal 创建容器 docker run -itd --name mongo -p 8036:27017 mongo:4.4.14-focal --auth 配置管理员 进入容器 docker exec -it mongo bash 进入终端 mongo 进入admin数据库 use admin 创建管理员账户 db.c…

Pytorch深度学习-----优化器详解(SGD、Adam、RMSprop)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…

python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

决策树算法 特征工程-特征提取 特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串,将字符串转换为机器可以读懂的数字特征,才能让计算机理解该字符串(特征)表达的意义。 主要分为:字典特征提取(特征离散化)…

Grafana V10 告警推送 邮件

最近项目建设完成,一个城域网项目,相关zabbix和grafana展示已经完,想了想,不想天天看平台去盯网络监控平台,索性对告警进行分类调整,增加告警的推送,和相关部门的提醒,其他部门看不懂…

嵌入式Linux的学习之初试uboot

背景 在工作中,部门里的嵌入式大屏设备都是安卓开发的。但是安卓系统对硬件要求会高一些,成本也高,部门打算换为Linux系统。遂开始回忆嵌入式Linux系统的开发,并且找了一些教程学习。 找教程的过程真的很艰辛啊,很多开…

http get、post、put

HTTP协议定义了多种请求方法,用于不同的操作。最常见的有 GET、POST 和 PUT。 GET:GET 是最常用的方法,通常用于请求服务器发送某个资源。GET 请求只通过 URL 传送数据,数据信息会附在 URL 之后,以参数的形式附加。由于这种传送方式的限制,GET 请求的数据量较小,且安全性…

Spring Boot开发指南

目录 1. 构建系统 1.1. 依赖管理 1.2. Maven Maven项目结构 1.3. Starter 2. 代码结构 2.1. “default” 包 2.2. 启动类的位置 3. Configuration 类 3.1. 导入额外的 Configuration 类 3.2. 导入 XML Configuration 4. 自动装配(配置) 4.1…

web集群学习:基于CentOS 7构建 LVS-DR 群集并配置服务启动脚本

目录 1、环境准备 2、配置lvs服务启动脚本 1、在RS上分别配置服务启动脚本 2、在lvs director上配置服务启动脚本 3、客户端测试 配置LVS-DR模式主要注意的有 1、vip绑定在RS的lo接口; 2、RS做arp抑制; 1、环境准备 VIP192.168.95.10 RS1192.168…

Qt应用开发(基础篇)——时间微调输入框QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

Android 13 Hotseat定制化修改——005 hotseat图标禁止形成文件夹

目录 一.背景 二.方案 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动…

嘉楠勘智k230开发板上手记录(三)--K230_GPU应用实战

按照K230_GPU应用实战.md 一、开发环境的准备 在src下创建文件夹,并在文件夹中创建Makefile mkdir my_vglite_code cd my_vglite_codeMakefile # SDK地址 K230SDK ? /root/k230/k230_sdk-main # 生成的可执行文件名字 BIN : test-vglite# 指定交叉编译器 CC : …

微信小程序中背景图片如何占满整个屏幕,拉伸

不变形 1. 在页面的wxss文件中,设置背景图片的样式: page{background-image: url(图片路径);background-size: 100% 100%;background-repeat: no-repeat; }2. 在页面的json文件中,设置背景图片的样式: {"backgroundTextStyl…

python-爬虫作业

# -*- coding:utf-8 -*-Author: 董咚咚 contact: 2648633809qq.com Time: 2023/7/31 17:02 version: 1.0import requests import reimport xlwt from bs4 import BeautifulSoupurl "https://www.dygod.net/html/gndy/dyzz/" hd {user-Agent:Mozilla/4.0 (Windows N…

Adaptive AUTOSAR—— Communication Management 3.1

9 Communication Management 9.1 What is Communication Management? 通信管理是自适应平台架构中的一个功能集群。 作为一个功能集群,通信管理向应用程序提供了一个C++ API,实现了面向服务的通信。服务是一个由应用程序提供的功能单元,可以在运行时被另一个应用程序动态…

【新版系统架构补充】-信息系统基础知识

信息系统 信息系统的5个基本功能:输入、存储、处理、输出和控制 信息系统的分类(低级到高级):业务(数据)处理系统(TPS/DPS)、管理信息系统(MIS)、决策支持系…

JAVA Android 正则表达式

正则表达式 正则表达式是对字符串执行模式匹配的技术。 private void RegTheory() {// 正则表达式String content "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2) " "的3个版本:…

PostgreSQL 使用SQL

发布主题 设置发布为true 这个语句是针对 PostgreSQL 数据库中的逻辑复制功能中的逻辑发布(Logical Publication)进行设置的。 PostgreSQL 中,逻辑复制是一种基于逻辑日志的复制方法,允许将数据更改从一个数据库实例复制到另一…

git撤回最近一次push操作

git push -f origin HEAD^:branch_name其中,branch_name 是你想要撤回 push 操作的分支的名称。 这个命令将会强制推送到远程仓库,将远程分支回滚到上一个提交(HEAD^ 意味着上一个提交)。这样做会丢失最近一次 push 的更改&#…

Linux文件属性与权限管理(可读、可写、可执行)

Linux把所有文件和设备都当作文件来管理,这些文件都在根目录下,同时Linux中的文件名区分大小写。 一、文件属性 使用ls -l命令查看文件详情: 1、每行代表一个文件,每行的第一个字符代表文件类型,linux文件类型包括&am…

springboot高级

springboot 进阶 SpringBoot 整合 Mybatis【重点】 SpringBoot单元测试【掌握】 SpringBoot整合SpringMVC【掌握】 SpringBoot异常处理【掌握】 SpringBoot定时任务【掌握】 SpringBoot打包【掌握】 一、SpringBoot 整合 Mybatis 1、SpringBoot 整合 Mybatis MyBatis …