【MySQL】基本架构与执行过程

2023-05-16

【MySQL】基本架构与执行过程

在这里插入图片描述

1 日志

MySQL 是通过文件系统对数据索引后进行存储的,MySQL 从物理结构上可以分为 日志文件数据及索引文件 。MySQL 在 Linux 中的数据索引文件和日志文件通常放在 /var/lib/mysql 目录下。MySQL 通过日志记录了数据库操作信息和错误信息。

可以通过命令查看当前数据库中的日志使用信息:

show variables like 'log_%';

show variables like "%_log";

可以看到:

在这里插入图片描述

常见的日志:

  • 慢查询日志
  • 错误日志
  • 普通日志
  • 二进制日志
  • 事务重做日志

错误日志 error log

默认开启,错误日志记录了运行过程中 遇到的所有严重的错误信息,以及 MySQL 每次启动和关闭的详细信息

错误日志所记录的信息是可以通过 log_errorlog_warnings 配置 来定义的。从 5.5.7 以后无法关闭错误日志。

  • log_error:指定错误日志存储位置
  • log-warnings:是否将警告信息输出到错误日志中。

二进制日志 bin log

默认关闭,需要通过以下配置进行开启。binlog 记录了数据库所有的 ddl 语句和 dml 语句,但不包括 select 语句内容 ,语句以事件的形式保存,描述了数据的变更顺序,binlog 还包括了每个更新语句的执行时间信息。

如果是 DDL 语句,则直接记录到 binlog 日志,而 DML 语句,必须通过事务提交才能记录到 binlog 日志中。

binlog 主要用于实现 mysql 主从复制、数据备份、数据恢复

在这里插入图片描述

数据定义语言:简称 DDL(Data Definition Language)

  • 作用:用来定义数据库对象:数据库,表,列等
  • 关键字:create,alter,drop

数据操作语言:简称 DML(Data Manipulation Language)

  • 作用:用来对数据库中表的记录进行更新
  • 关键字:insert,delete,update

数据查询语言:简称 DQL(Data Query Language)

  • 作用:用来查询数据库中表的记录
  • 关键字:select,from,where

数据控制语言:简称 DCL(Data Control Language)

  • 作用:用来定义数据库的访问权限和安全级别,及创建用户
  • 关键字:grant, deny, revoke

通用查询日志 general query log

默认关闭, 由于通用查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘 IO,会影响 mysql 的性能的。

如果不是为了调试数据库,不建议开启查询日志。

慢查询日志 slow query log

默认关闭, 通过以下设置开启。记录执行时间超过 long_query_time 秒的所有查询,便于收集查询时间比较长的 SQL 语句。

查看阈值:

show global status like '%Slow_queries%';
show variables like '%slow_query%';
show variables like 'long_query_time%';

2 数据文件

MySQL 的数据及索引文件存储在哪?

show variables like '%datadir%';

在这里插入图片描述

情况一:ibdata 文件

使用 「系统表空间」 存储表「数据和索引」信息,所有表共同使用一个或者多个 ibdata 文件

情况二:InnoDB 存储引擎的数据文件

  • .frm 文件:主要存放与表相关的数据信息,主要包括 表结构的定义信息
  • .ibd 文件:使用 「独享表空间」 存储表 数据和索引 信息,一张表对应一个 ibd 文件。

在这里插入图片描述

mysql 8 中,没有 .frm 文件了,取而代之的是 .sdi

情况二:MyISAM 存储引擎的数据文件

  • .frm 文件:主要存放与表相关的数据信息,主要包括表结构的定义信息

  • .myd 文件:主要用来存储表数据信息

  • .myi 文件:主要用来存储表数据文件中 任何索引的数据树

3 一条查询SQL语句的完整执行流程

分析SQL语句如下:

select c_id,first_name,last_name from customer where c_id=14;

大体来说,MySQL 可以分为 Server 层 和 存储引擎层 两部分:

  1. Server层
  • 包括:连接器、查询缓存、分析器、优化器、执行器
  • 涵盖 MySQL 的大多数核心服务功能
  • 所有的 内置函数(如日期、时间、数学和加密函数等),所有 跨存储引擎的功能 都在这一层实现
  1. 存储引擎层
  • 负责数据的存储和提取
  • 可插拔式存储引擎:InnoDB、MyISAM、Memory 等
  • 最常用存储引擎是 InnoDB
  • 从 MySQL 5.5 版本开始,默认是 InnoDB

在这里插入图片描述

第一步:连接到数据库

首先会连接到这个数据库上,这时候接待你的就是 连接器

-- 连接命令 
mysql -h127.0.0.1 -P3306 -uroot -p

连接完成后,如果你没有后续的动作,这个连接就处于 空闲状态 。客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的默认值是 8 小时。

mysql> show processlist; 
# 其中的 Command 列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。

在这里插入图片描述

第二步:查缓存

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。

之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句 hash 之后的值,value 是查询的结果。

  • 如果你的查询语句在缓存中,会被直接返回给客户端。
  • 如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

如果查询命中缓存,MySQL 不需要执行后面的复杂操作就可以直接返回结果,效率会很高!但是 不建议使用 MySQL 的内置缓存功能!

查询缓存

查询缓存 默认是关闭 的状态。

# 1)查看是否开启缓存 
mysql> show variables like 'query_cache_type'; 

# 2)查看缓存的命中次数 
mysql> show status like 'qcache_hits';

# 3)开启缓存 /etc/my.cnf文件中修改“query_cache_type”参数 
值为`0或OFF`会禁止使用缓存。 
值为`1或ON`将启用缓存,但以`SELECT SQL_NO_CACHE`开头的语句除外。 
值为`2或DEMAND`时,只缓存以`SELECT SQL_CACHE`开头的语句。

修改配置文件 my.cnf ,在文件中增加如下内容开启缓存:

query_cache_type=2

查询SQL:

mysql> select * from city where city_id = 1;

在这里插入图片描述

清空查询缓存

可以使用下面三个SQL来清理查询缓存:

FLUSH QUERY CACHE; # 清理查询缓存内存碎片。 
RESET QUERY CACHE; # 从查询缓存中移出所有查询。 
FLUSH TABLES; # 关闭所有打开的表,同时该操作将会清空查询缓存中的内容。

为什么不建议使用内置缓存?

因为查询缓存往往弊大于利:

  • 成本高: 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空 。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。
  • 命中率不高: 对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张 静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
  • 功能并不如专业的缓存工具更好: redis、memcache、ehcache…

好在 MySQL 也提供了这种 按需使用 的方式。你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样:

mysql> select sql_cache * from city where city_id = 1;

注意:MySQL 8.0 版本直接将查询缓存的整块功能删掉了!

第三步:分析器

如果查询缓存没有命中,接下来就需要进入正式的查询阶段了。

客户端程序发送过来的请求,实际上只是一个字符串而已,所以 MySQL 服务器程序首先需要对这个字符串做分析,判断请求的语法是否正确,然后从字符串中将要查询的表、列和各种查询条件都提取出来,本质上是对一个 SQL 语句编译的过程,涉及 词法解析语法分析预处理器 等。

  • 词法分析: 词法分析就是把一个完整的 SQL 语句分割成一个个的字符串
  • 语法分析: 语法分析器根据词法分析的结果做语法检查,判断你输入的SQL 语句是否满足 MySQL 语法。
  • 预处理器: 预处理器则会进一步去检查解析树是否合法,比如表名是否存在,语句中表的列是否存在等等,在这一步 MySQL 会检验用户是否有表的操作权限。

词法分析

比如:这条简单的 SQL 语句,会被分割成 10 个字符串:

# 分隔前 
select c_id,first_name,last_name from customer where c_id=14; 
# 分隔后 
select,c_id,first_name,last_name,from,customer,where,c_id,=14

MySQL 同时需要识别出这个 SQL 语句中的字符串 分别是什么,代表什么

  • 把 “select” 这个关键字识别出来,这是一个查询语句
  • 把 “customer” 识别成 “表名 customer”
  • 把 “c_id“ 识别成 “列 c_id”

语法分析

如果语法正确就会根据 MySQL语法规则与SQL 语句生成一个数据结构,这个数据结构我们把它叫做 解析树

You have an error in your SQL syntax ”错误提醒就是在这个位置出现的。如 拼错关键词 等。

解析树例子:

在这里插入图片描述

预处理器

预处理器则会进一步去检查 解析树 是否合法,比如 表名是否存在,语句中表的列是否存在 等等。

在这一步 MySQL 会检验用户是否有表的操作权限。预处理之后会得到一个新的解析树,然后调用对应执行模块。

第四步:优化器

优化器顾名思义就是对查询进行优化。作用是根据解析树生成「不同的」执行计划,然后选择最优的「执行计划」。

MySQL 里面使用的是 基于成本模型 的优化器,哪种 执行计划 Explain 执行时成本最小就用哪种。而且它是 io_costcpu_cost 的开销总和,它通常也是我们评价一个查询的执行效率的一个常用指标。

查看上次查询成本开销,默认值是 0:

show status like 'Last_query_cost';

优化器可以做哪些优化呢?

  • 当有多个索引可用的时候,决定使用哪个索引
  • 在一个语句有多表关联(join)的时候,决定各个表的连接顺序,以哪个表为基准表

举个栗子:

比如 hello 数据库中表 customer 上执行下面的语句,这个语句用到了两个索引 last_name 和 address_id:

# hello数据库中表customer 
explain select * from customer where last_name='刘皇叔' and address_id=11;

既可以使用last_name索引查询,然后过滤列address_id;也可以使用address_id索引查询,然后过滤列last_name。

两种执行计划的结果是一样的,但是执行效率会有所不同,而优化器的作用就是决定选择使用哪一个方案

使用explain工具可以查看优化器的执行计划:

在这里插入图片描述

注意:优化器最多就是辅助,作用很有限,我们的 SQL 语句不能依赖于 MySQL 的优化器去调优!如果 SQL 语句垃圾,则没有可优化的空间。优化 SQL 的根本在于掌握 MySQL 分析与调优知识。

第五步:执行器

1)判断执行权限

开始执行的时候,要先判断一下你对这个表 customer 有没有执行查询的权限,如果没有,就会返回没有权限的错误。

2)调用存储引擎接口查询

如果有权限,就使用指定的存储引擎打开表开始查询。 执行器会根据表的引擎定义,去使用这个引擎提供的查询接口提取数据。

  • c_id 是 主键 执行流程:
    • 调用 InnoDB 引擎接口,从主键索引中检索 c_id=14 的记录
    • 主键索引「等值查询」只会查询出一条记录,直接将该记录返回客户端
    • 至此,这个语句就执行完成了
    • 不够详细,还可增加内存结构等
  • c_id 不是 主键 执行流程:全表扫描
    • 调用 InnoDB 引擎接口取这个表的第一行,判断 c_id 值是不是 14,如果不是则跳过,如果是则将这行缓存在结果集中
    • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行
    • 执行器将上述遍历过程中所有满足条件的行组成的结果集返回给客户端
    • 至此,这个语句就执行完成了

举个例子:

比如:我们新建一个用户 mysql_user,只有表 actor 的查询权限,没有表 customer 的查询权限。

CREATE USER `mysql_user`@`localhost` IDENTIFIED BY '123456@heroA'; 
GRANT Select ON TABLE `hello`.`test` TO `mysql_user`@`localhost`;

使用这个用户 mysql_user 连接 mysql,执行下面的查询语句,就会返回 没有权限的错误

mysql -umysql_user -p123456@heroA 
mysql> select * from customer where c_id=14;

在这里插入图片描述

存储引擎查看与设置

在MySQL中可以使用不同的存储引擎:

# 查看支持的存储引擎 
> show engines;

在这里插入图片描述

只有 InnoDB 引擎支持事务、行锁、外键!!!

在选择引擎时尽可能使用 InnoDB 引擎。

  • MyISAM:早期版本默认的引擎。

  • Memory:所有的数据都是保存在内存中。

# 使用其他引擎,在mysql中默认使用InnoDB引擎,一个数据库中不同的表可以使用不同的引擎。 
create table t_myisam(a int primary key, b int) engine=myisam;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MySQL】基本架构与执行过程 的相关文章

  • Kali Linux 镜像 各个版本之间的区别

    按处理器架构来划分的话 xff0c 有 64 bit 32 bit armhf armel等版本 加light的是轻量版 e17 Mate LXDE等是不同的桌面环境 Kali Linux 2016 2 支持GNOME KDE Mate L
  • ubuntu16.04下px4环境搭建与固件编译

    px4官网提供了一个批处理方式搭建px4开发环境 xff0c 十分好用 xff0c 按照官网步骤 1 sudo usermod span class hljs a span G dialout span class hljs variabl
  • Top-down与Bottom-up

    简析 顾名思义 xff0c top down是由上至下 xff0c 而bottom up由下至上的意思 其实 xff0c 就我对本行业的理解 xff0c top 61 目的 objective xff0c bottom 61 方法细节 ac
  • MATLAB GPU加速

    以前使用matlab 的时候 xff0c 很多人都用过里面的并行工具箱 xff0c 用的最多的应该就是parfor 实际上 xff0c matlab里面已经有不少工具箱里面都有了支持GPU加速的函数 使用matlab 43 GPU加速的前提
  • 论如何最低成本进入 智能家居、人工智能、安卓主板 的领域

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • 为什么说枚举单例模式是最安全的?

    单例模式有很多种 xff0c 如 xff1a 饿汉式 线程安全 xff0c 但是浪费资源 xff1b 懒汉式 懒汉式又分为 xff0c 同步锁单例模式 性能较差 xff1b 双重判断同步锁单例模式 静态内部类单例模式 以上单例模式大多数都是
  • Qt - 信号与槽的连接方式

    信号与槽的连接方式主要有以下5种方式 xff1a 先看代码 xff1a ifndef MYOBJECT H define MYOBJECT H include lt QObject gt class MyObject public QObj
  • vslam流程框架介绍

    平常扫地机产品上经常听说使用了vslam技术 xff0c 那么这个vslam到底是什么呢 xff0c 我们下面一起来看看 vslam是什么 xff1f VSLAM 即 Visual Simultaneous Localization and
  • linux出现oom分析流程

    背景 linux内核有个机制叫OOM killer Out Of Memory killer xff0c 当系统需要申请内存却申请不到时 xff0c OOM killer会检查当前进程中占用内存最大者 xff0c 将其杀掉 xff0c 腾出
  • 浅入浅出linux中断子系统

    浅入浅出linux中断子系统 xff0c 如需深入 xff0c 直接跳转重要参考章节 什么是中断 xff1f 当CPU被某些信号触发 xff0c CPU暂停当前工作 xff0c 转而处理信号的事件 xff0c 简单的称它为中断 xff0c
  • ROS2交叉编译操作

    ROS2移植过程 在移植ROS2之前 先确认需要移植的版本以及其对应的依赖 这些信息可以在 ROS 2 Releases and Target Platforms 中有介绍 可依据自身需要使用的平台 参考该链接进行选择 下面以ROS2 Hu
  • gstreamer学习笔记---pad定义、连接、流动

    pad相当于element的接口 xff0c 各个element就是通过pad连接进行传输数据 xff0c 同时pad会通过caps限制特定的数据类型通过 xff0c 只有当两个pad的caps数据类型一致时才可以建立连接 那么pad在el
  • gstreamer学习笔记---gst-omx

    一 openMAX理解1 gst omx是基于openMAX开发的插件 xff0c 所以在介绍gst omx之前 xff0c 我们先了解一下openMAX openMAX xff1a open media acceleration xff0
  • csi mipi信号解析

    1 传输模式 LP xff08 Low Power xff09 模式 xff1a 用于传输控制信号 xff0c 最高速率 10 MHz HS xff08 High Speed xff09 模式 xff1a 用于高速传输数据 xff0c 速率
  • 程序调试方法

    记录初衷 xff1a 遇到问题 xff0c 按照一套方法 xff0c 把问题化解 xff0c 逐渐的内化为心法 xff0c 形成经验 xff0c 这就是成长的过程 就好比吃的猪肉 xff0c 经过消化 分解 吸收后变成了自己肉 程序分为三种
  • 博客八:基于xr871实现wifi音响产品

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • 用 Docker 部署一个 Python 应用

    Flask项目 这里为了演示的方便 xff0c 我们就写一个简单的Flask项目 xff0c 代码如下 from flask import Flask app 61 Flask name 64 app route 39 39 def ind
  • Realsence D455标定并运行Vins-Fusion

    文章目录 一 双目相机标定1 标定板准备1 1 打印标定板1 2 标定板信息原始pdf的格子参数是 xff1a 调整后的格子参数是 xff1a 2 左右目相机数据准备2 1 修改rs camera launch内容2 2 关闭结构光2 3
  • 【Linux命令】文件和目录权限

    Linux命令 文件和目录权限 权限查看 众所周知 xff0c 可以使用 ls l 来查看文件和目录的详细信息 xff0c 那么输出的东西是什么呢 xff1f 我们先来看 文件类型 xff1a xff1a 普通文件 xff1b d xff1
  • 【设计模式】单例模式

    设计模式 单例模式 1 为什么要用单例 xff1f 单例设计模式 xff08 Singleton Design Pattern xff09 xff1a 一个类只允许创建一个对象 xff08 或实例 xff09 1 1 处理资源访问冲突 例如

随机推荐

  • 【JAVA】基础语法

    JAVA 基础语法 JAVA面向对象三大特征 封装 继承 多态 1 类型转换 1 1 自动类型转换 自动类型转换 类型范围小的变量 可以直接赋值给类型范围大的变量 1 2 表达式的自动类型转换 在表达式中 小范围类型的变量会自动转换成当前较
  • 【Java技巧】如何在HashMap中插入重复的key?

    Java技巧 如何在HashMap中插入重复的key xff1f 问题引出 我们都知道 xff0c Map 的 key 需要保证唯一性 插入重复的 key 会被最后插入的 key 所覆盖 xff0c 如 xff1a span class t
  • ArrayList源码分析

    ArrayList源码分析 注意 本笔记分析对象为 Java8 版本 随版本不同 源码会发生变化 1 ArrayList类图与简介 ArrayList是一个 非线程安全 基于数组实现的一个动态数组 可以看到 它的顶层接口是 Collecti
  • Vector源码分析

    Vector源码分析 1 Vector基本介绍与类图 Vector 类实现了一个动态数组 和 ArrayList 很相似 但是两者是不同的 Vector 是同步访问的 Vector 包含了许多传统的方法 这些方法不属于集合框架 Vector
  • LinkedList源码分析

    LinkedList源码分析 注意 本笔记分析对象为 Java8 版本 随版本不同 源码会发生变化 基本介绍与类图 LinkedList 同时实现了 List 接口和 Deque 对口 也就是收它既可以看作一个顺序容器 又可以看作一个队列
  • 【网管日记】Linux防火墙操作

    网管日记 Linux防火墙操作 记录一下常用的Linux防火墙操作 xff1a 查看防火墙状态 systemctl status firewalld 或 firewall cmd state暂时关闭防火墙 systemctl stop fi
  • (毕业设计资料)基于51单片机的智能窗控制系统设计

    实现参考功能 1 可实时显示年月日 时分秒 光照强度和控制模式 xff1b 2 可通过手动控制窗帘的开启和关闭 xff1b 3 可通过设置开启和关闭时间来控制窗帘 xff1b 4 可通过检测光照强度的亮暗来控制窗帘 xff1b 5 使用步进
  • 网络操作系统 第十二章 FTP服务器的安装与配置

    习题 1 简述FTP的连接模式 FTP的连接模式有PORT和PASV两种 xff0c 其中PORT模式是主动模式 xff0c PASV是被动模式 xff0c 这里所说的主动和被动都是相对于服务器而言的 如果是主动模式 xff0c 数据端口为
  • 【网管日记】MySQL主从复制

    MySQL主从复制 基本介绍 MySQL 主从复制是一个异步的复制过程 xff0c 底层是基于 Mysql 数据库自带的 二进制日志 功能 一台或多台 MySQL 数据库 xff08 slave xff0c 即 从库 xff09 从另一台
  • 【网管日记】Nginx基本介绍、安装与使用

    Nginx基本使用 基本介绍 Nginx是一款轻量级的Web服务器 反向代理服务器及电子邮件 xff08 IMAP POP3 xff09 代理服务器 其特点是 占用内存少 xff0c 并发能力强 xff0c 事实上nginx的并发能力在同类
  • 【网管日记】Nginx报错踩坑记录

    网管日记 Nginx报错踩坑记录 1 防火墙没关闭 自启 error 21113 0 21 connect failed 113 No route to host while connecting to upstream 解决方法 xff1
  • 【数据结构与算法】Manacher算法

    Manacher算法 https github com SongJianHIT DataStructurs Algorithm tree main src algorithms manacher 基本介绍 Manacher 算法常用于 求一
  • 【数据结构与算法】DP路径问题

    问题 xff1a 最小路径和 给定一个包含非负整数的 m x n 网格 grid xff0c 请找出一条从左上角到右下角的路径 xff0c 使得路径上的数字总和为最小 说明 xff1a 每次只能向下或者向右移动一步 示例 1 xff1a 输
  • 【Java开发】Dependency ‘XXX‘ not found

    Java开发 Dependency XXX not found 在配置 pom 文件时 xff0c 遇到 Dependency 39 com google guava guava 30 0 jre 39 not found 方法一 xff1
  • 【Mysql】日期函数总结

    Mysql 日期函数总结 1 获取日期时间函数 1 1 获取当前日期时间 span class token keyword SELECT span span class token function NOW span span class
  • 【Java开发笔记】线程池

    Java开发笔记 线程池 线程池 ThreadPoolExecutor 的七大核心参数 xff1a 核心线程数 corePoolSize最大线程数 maxinumPoolSize超过核心线程数的闲余线程存活时间 keepAliveTime存
  • 【Java开发笔记】分库分表

    Java开发笔记 分库分表 1 分库分表基本概述 为什么要分库分表 xff1f 性能角度 分库分表就是为了解决由于数据量多大而导致数据库性能下降的问题 xff1a 原来独立的数据库拆分成若干数据库组成将原来的大表 xff08 存储近千万数据
  • 【网关日记】配置阿里云容器镜像加速

    运行 xff1a sudo mkdir p etc docker sudo tee etc docker daemon json lt lt 39 EOF 39 34 registry mirrors 34 34 https qbd2mty
  • 【毕业设计】基于51单片机的智能窗帘设计(原理图+原理图+仿真+论文)

    按键1 xff1a 加 xff08 手动开启窗帘 按键2 xff1a 减 xff08 手动关闭窗帘 xff09 按键3 xff1a 进入定时模式开启时间和光控阈值数值大小的开启 按键4 xff1a 进入当前时间的设置 xff08 年 月 日
  • 【MySQL】基本架构与执行过程

    MySQL 基本架构与执行过程 1 日志 MySQL 是通过文件系统对数据索引后进行存储的 xff0c MySQL 从物理结构上可以分为 日志文件 和 数据及索引文件 MySQL 在 Linux 中的数据索引文件和日志文件通常放在 var