MySQL之SQL的执行流程

news2024/12/20 1:57:54

MySQL之SQL的执行流程

  • MySQL架构
    • 连接层
    • 服务层
    • 存储引擎
  • 连接
    • 查看连接
    • 连接与线程
    • 连接超时
    • 最大连接
    • 会话与全局
  • 查询缓存
  • 语法解析和预处理
    • 词法解析
    • 语法解析
    • 预处理
  • 查询优化器
    • 优化器
    • 查询执行计划
  • 存储引擎
    • 存储引擎概述
    • 常用存储引擎
      • MyISAM
      • InnoDB
      • MEMORY
    • 存储引擎的选择
  • 执行引擎

MySQL架构

从整体上,可以把MySQL分成三层:

客户端对接的连接层

真正执行操作的服务层

跟硬件打交道的存储引擎层

在这里插入图片描述

连接层

客户端要连接MySQL服务器3306端口,必须跟服务端建立连接。

管理所有的连接,验证客户端的身份和权限,这些功能在连接层完成。

服务层

连接层会把SQL语句交给服务层,这里面又包含一系列的流程:

查询缓存的判断

根据SQL调用相应的接口

对SQL语句进行词法和语法的解析

然后就是优化器,MySQL底层会根据一定的规侧对SQL语句进行优化,最后再交给执行器去执行。

存储引擎

存储引擎就是数据真正存放的地方,在MySQL里面支持不同的存储引擎。再往下就是内存或者磁盘。

连接

MySQL服务监听端口默认是3306

客户端连接服务端:可以是同步、异步的、长连接、短连接、TCP、Unix Socket等方式

MySQL有专门处理连接的模块,连接的时候需要验证权限

查看连接

查看MySQL当前有多少个连接,使用show status命令,模糊匹配Thread:

mysql> show global status like'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 1     |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.01 sec)

参数说明:

Threads_cached:缓存中的线程连接数
Threads_connected:当前打开的连接数
Threads_created:为处理连接创建的线程数
Threads_running:非睡眠状态的连接数,通常指并发连接数

连接与线程

客户端连接和服务端线程的关系:

客户端每产生一个连接或者一个会话,在服务端就会创建一个线程来处理

分配线程话,保持连接会消耗服务端的资源。MySQL会把长时间不活动的(SLEEP)连接自动断开

连接超时

连接超时参数:

默认28800 秒,8 小时。

#  非交互式超时时间, 如JDBC 程序
show global variables like'wait _timeout';

# 交互式超时时间, 如数据库工具
show global variables like'interactive_ timeout'; 

最大连接

MySQL服务允许最大连接数(并发数),在5.7版本中默认是151个,最大可以设置成100000

mysql> show variables like'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 500   |
+-----------------+-------+
1 row in set (0.01 sec)

会话与全局

MySQL中的参数(变量)分为`session`和`global`级别,分别是在当前会话中生效和全局生效

并不是每个参数都有两个级别,比如max_connections就只有全局级别

当没有带参数的时候, 默认是session级别,包括查询和修改。如修改—个参数以后,在本窗口查询生效, 但其他窗口不生效

因此,如果是临时修改,则修改session级别,如果需要在其他会话中生效,必须显式地加上global参数

查询缓存

MySQL内部自带了一个缓存模块,MySQL缓存默认是关闭状态,即不推荐使用。

mysql> show variables like 'query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | OFF      |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
5 rows in set (0.01 sec)

MySQL自带缓存应用场景有限

要求SQL语句必须一模一样,中间多一个空格,字母大小写不同都被认为是不同的的SQL

表里面任何一条数据发生变化的时候,这张表所有缓存都会失效

在MySQL8.0中,查询缓存已经被移除

通常缓存这一块还是交由ORM框架(如yBatis默认开启一级缓存)、或使用独立缓存服务

语法解析和预处理

语法解析使用Parser解析器模块,预处理使用Preprocessor预处理模块

语法解析和预处理就是:对语句基于SQL语法进行词法和语法分析和语义的解析。

词法解析

词法解析就是把一个完整的SQL语句打碎成一个个的单词,记录每个单词/符号是什么类型,从哪里开始到哪里结束。

语法解析

语法解析会对SQL做一些语法检查,如单引号有没有闭合,然后根据MySQL定义的语法规则,根据SQL语句生成一个数据结构。这个数据结构叫做解析树

预处理

预处理会检查生成的解析树,解决解析器无法解析的语义。如检查表和列名是否存在,检查名字和别名,保证没有歧义。预处理之后得到一个新的解析树。

查询优化器

优化器

查询优化器使用MySQL的查询优化器的模块(Optimizer)

一条SQL语句是可以有很多种执行方式的,最终返回相同的结果,他们是等价的。

查询优化器的目的就是根据解析树生成不同的执行计划(Execution Plan),然后选择一种最优的执行计划,MySQL里面使用的是基于开销(coSt)的优化器,那种执行计划开销最小,就用哪种。

查看查询开销:

mysql> show status like 'Last_query_cost';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| Last_query_cost | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

查询执行计划

经过优化器优化完之后,优化器最终会把解析树变成一个查询执行计划,查询执丸行计划是一个数据结构。

M小ySQL提供一个执行计划的工具。在SQL语句前面加上EXPLAIN,就可以看到执行计划的信息。

mysql> EXPLAIN select *  from user where id=1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | user  | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)

如果需要得到更详细的信息,可以使用:FORMAT=JSON

mysql> EXPLAIN FORMAT=JSON  select *  from user where id=1;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "1.00"
    },
    "table": {
      "table_name": "user",
      "access_type": "const",
      "possible_keys": [
        "PRIMARY"
      ],
      "key": "PRIMARY",
      "used_key_parts": [
        "id"
      ],
      "key_length": "4",
      "ref": [
        "const"
      ],
      "rows_examined_per_scan": 1,
      "rows_produced_per_join": 1,
      "filtered": "100.00",
      "cost_info": {
        "read_cost": "0.00",
        "eval_cost": "0.20",
        "prefix_cost": "0.00",
        "data_read_per_join": "776"
      },
      "used_columns": [
        "id",
        "name",
        "age"
      ]
    }
  }
} |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

存储引擎

存储引擎概述

默认情况下,每个数据库有一个自己文件夹。创建表后,在该文件夹下会产生与表名相关的文件。任何一个存储引擎都有一个fm文件,这个是表结构定义文件。不同的存储引擎存放数据的方式不一样,产生的文件也不一样。

innodb存储引擎是1个

memory存储引擎没有

myisam存储引擎是2

查看数据库数据存放路径

mysql> show variables like 'datadir';
+---------------+-------------------+
| Variable_name | Value             |
+---------------+-------------------+
| datadir       | /www/server/data/ |
+---------------+-------------------+
1 row in set (0.01 sec)

创建数据库与不同存储引擎的数据表

CREATE DATABASE mydb;

CREATE TABLE `user-InnoDB` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


CREATE TABLE `user-MyISAM` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


CREATE TABLE `user-MEMORY` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8

查看验证

[root@administrator mydb]# pwd
/www/server/data/mydb
[root@administrator mydb]# ls
db.opt  user@002dInnoDB.frm  user@002dInnoDB.ibd  user@002dMEMORY.frm  user@002dMyISAM.frm  user@002dMyISAM.MYD  user@002dMyISAM.MYI

常用存储引擎

MyISAM

MyISAM应用范围比较小。表级锁定限制了读/写的性能,通常用于只读或以读为主的工作。

特点:

支持表级别的锁(插入和更新会锁表)

不支持事务

拥有较高的插入(insert)和查询(select)速度

存储了表的行数(count速度更快

InnoDB

InnoDB是mysq5.7中的默认存储引擎。

InnoDB是一个事务安全的MySQL存储引擎,它具有提交、回滚和崩溃恢复功能来保护用户数据。

InnoDB使用行级锁,提高多用户并发性和性能。

InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的I/O。

为了保持数据完整性,InnoDB还支持外键引用完整性约束

适合经常更新的表,存在并发读写或者有事务处理的业务系统

特点:

支持事务,支持外键,因此数据的完整性、一致性更高

支持行级别的锁和表级别的锁

支持读写并发,写不阻塞读

特殊的索引存放方式,可以减少O,提升查询效率

MEMORY

MEMORY将所有数据存储在RAM中,以便在需要快速查找非关键数据的环境中快速访问。

InnoDB及其缓冲池内存区域提供了一种通用、持久的方法来将大部分或所有数据保存在内存中,而ndbcluster为大型分布式数据集提供了快速的键值查找。

特点:

把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失。只适合做临时表。

将表中的数据存储到内存中

存储引擎的选择

MySQL支持多种存储引擎,主要使用三种:InnoDB、AyISAM、MEMORY

具体参考:https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html

一张表的存储引擎,是在创建表的时候指定的,使用ENGINE关键字,如:ENGINE=InnoDB。没有指定的时候,数据库使用默认的存储引擎

5.5.5之前,默认的存储引擎是AyISAM

5.5.5之后,默认的存储擎是InnoDB

MySQL之所以支持这么多的存储引擎,就是因为有不同的业务需求,一种存储引擎不能提供所有的特性。

如果对数据致性要求比较高,需要事务支持,可以选择InnoDB

如果数据查询多更新少,对查询性能要求比较高,可以选择MyISAM

如果需要一个用于查询的临时表,可以选择MEMORY

当所有存储引擎不满足需求,可自定义存储引擎:https://dev.mysql.com/doc/internals/en/custom-engine.html

注意:每个存储引擎都有自己对应的服务

show engine innodb status;

执行引擎

执行引擎是利用存储引擎提供的相应的AP来完成操作,完成后把数据返回给客户端。

即使修改表的存储引擎,由于不同功能的存储引擎实现的API是相同的,因此操作方式也不需要做任何改变

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

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

相关文章

DBMS 中的 2 层架构与 3 层架构

有多种方法可以获取存储在数据库管理系统中的数据。根据其结构对 DBMS 的体系结构进行了分类。 DBMS 架构概述 理解 2-tier 和 3-tier 架构是一个相当重要的话题,不仅对于学术或寻找好工作,而且对于与技术相关的一般意识也是如此。 2-tier simple表示两…

【每日渗透笔记】覆盖漏洞+修改隐藏数据实战尝试

目录 一、特点: 1.1、特征: 1.2、知识: 1.3、注册的功能点: 目前: 问题: 二、分析数据包 2.1、修改数据处 三、换思路 一、特点: 1.1、特征: 存在注册的功能点 1.2、知识&a…

资本狂欢过后 Aptos如何顶住旧日光环?

10月27日,Aptos Autumn主网上线一周后,其浏览器数据显示,该Layer1网络的交易总量为1432万笔,TPS为10.65,原生Token APT总供应量约为10.02亿,质押数量约为8.23亿枚,活跃节点数量102个。 低TPS、高…

AIR780E使用AT连接TCP收发数据

最近各种技术群都被合宙9.9的开发板刷屏了,笔者成功的第一时间拼团成功,已经作为前两百人收到开发板了,因为官方的二次开发固件还没出,就先玩一下传统的AT开发。 文中各种文档和资料均可以在air780e.cn网站找到。 本文将介绍如何…

99208-90-9_炔基-棕榈酸_Alkynyl Palmitic Acid 可进行定制

一、产品简介----Product introduction: 货号:Y-CL-0063 CAS:99208-90-9 中文名: 15-十六碳炔酸,炔基-棕榈酸 英文名:Alkynyl Palmitic Acid/hexadec-15-ynoic acid 结构式(Structural&#xff…

深度学习:GoogLeNet核心思想详细讲解(原创)

深度学习:GoogLeNet核心思想详细讲解想法来源时代局限性稀疏运算特性稀疏矩阵稀疏运算并行计算结合稀疏与并行Inception blockGoogLeNetAverage pooling辅助分类器训练方法(Training Method)超参数设置模型集成训练阶段预测阶段基于GoogLeNet的服装分类(…

WordPress 6.1新功能 (特性和截图)

WordPress 6.1 Beta 于几天前发布,预计将于 2022 年 11 月 1 日发布。这将是 2022 年的最后一个主要版本,将带来许多新功能和改进。 我们一直在密切监视开发并在我们的测试站点上尝试新功能。 在本文中,我们将通过功能和屏幕截图让您先睹为快…

基于javaweb的医院管理系统(java+springboot+mybatis+vue+mysql)

基于javaweb的医院管理系统(javaspringbootmybatisvuemysql) 运行环境 Java≥8、MySQL≥5.7、Node.js≥10 开发工具 后端:eclipse/idea/myeclipse/sts等均可配置运行 前端:WebStorm/VSCode/HBuilderX等均可 适用 课程设计,大作业&…

对于一个即将上线的网站,如何测试

web应用:也叫做网站,相对于客户端应用来说,web应用无需单独安装,在浏览器上即可使用其功能。 web应用的主要开发流程如下: 在网站开发的整个流程中,测试验收是上线发布前的最后一个环节,测试是…

Linux环境下安装Jenkins

首先安装Jenkins之前,linux中必须安装好了JDK和Maven,如果还没有安装过,下面准备好安装教程 Linux环境安装JDK: https://www.cnblogs.com/xuliangxing/p/7066913.html Linux环境安装Maven: https://blog.csdn.net/qq_35868412/article/detail…

【数据库04】中级开发需要掌握哪些SQL进阶玩法

前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:相当硬核,黑皮书《数据库系统概念》读书笔记,讲解: 1.数据库系统的基本概念(数据…

Unicode云对象对接代码Demo

实现点击按钮,获取云对象返回内容,例下图 新建云对象-co1 index.obj.js代码 // 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj // jsdoc语法提示教程:https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129 mo…

深入理解计算机系统:内存越界引用和缓冲区溢出

注:最后有面试挑战,看看自己掌握了吗 文章目录原因造成后果缓冲区溢出执行攻击代码exploit code蠕虫和病毒的区别原因 C对数组引用不进行任何边界检查,而且局部变量和状态信息(寄存器值,返回地址)都放在栈…

2.1 Python 解释器

1. 什么是 Python 解释器 Python 解释器是解释 Python 脚本执行的程序. 开发者在编写 Python 代码保存后, 就会得到一个以.py为扩展名的文本文件, 若要运行此文件, 就需要Python解释器去执行.2. Python 解释器的种类 Python 有好几种版本的解释器:CPython: 官方版本的解释器,…

猿创征文|技术成长之各进制之间的转换

目录 一.非十进制转十进制 方法: 示例 解释 二进制转十进制 八进制转十进制 十六进制转十进制 二.十进制转非十进制 整数部分 方法 示例 十进制整数转二进制 十进制整数转八进制 十进制整数转十六进制 小数部分 方法 十进制小数转二进制 十进制小数转…

反应性叠氮化物N3-PEG-NH2,Azide-PEG-Amine,叠氮-聚二乙醇-胺

一:产品描述 1、名称 英文:N3-PEG-NH2,Azide-PEG-Amine 中文:叠氮-聚二乙醇-胺 2、CAS编号:N/A 3、所属分类:Amine PEG Azide PEG 4、分子量:可定制,叠氮-聚二乙醇-胺10k、叠氮…

Allegro DFM Ravel Rule检查工具介绍

Allegro DFM Ravel Rule检查工具介绍 Allegro任何一个版本都支持DFM Ravel Rule检查,即便是166的版本 打开后的界面如下所示 可以检查项目 测试点,阻焊,走线,丝印,过孔,milling,装配,outline相关的DFM检查 可以让违反规则的设计处以DRC的形式报出来 避免加工问题 首…

Spring+SpringMVC+Mybatis SSM框架详解

一、JDBC编程 1、JDBC 简介 JDBC其实就是 Java 官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接。 程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上…

VScode 官网下载太慢解决方法

用惯了HBuilder 和 WebStorm,发现身边很多人也在用 VSCode,就像尝试下。 但是,官网下载太慢了。https://code.visualstudio.com/ 我可是 500M 的宽带啊~!!! 有小道消息说,VSCode 对中国大陆用…

【Linux】软件包管理器 --- yum

目录🌈前言Linux 软件包管理器 yum🚁1、什么是软件包🚂2、yum指令🚃3、关于 rzsz🌈前言 本篇文章进行开发工具的学习!!! Linux 软件包管理器 yum 🚁1、什么是软件包 源…