MySQL - 一文了解MySQL的基础架构及各个组件的作用

2023-11-09

1. 概述

不管是开运、运维、测试,都或多或少的要接触MySQL,了解MySQL的基础架构及各个组件之间的关系,有助于我们更加深入的理解MySQL,下面由一张MySQL基础架构图来一起走进MySQL。

在这里插入图片描述
MySQL可以基本划分为Server层存储引擎层两部分:

Server层包含了MySQL大多数核心功能,除了图中标注的连接器,查询缓存,分析器,优化器,执行器,还有所有的内置函数(日期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等。

存储引擎层负责MySQL中数据的存储和提取。和Linux下的各种文件系统一样,每个存储引擎都有自己的优势和劣势,各种存储引擎通过提供API和Server层对接,通过API屏蔽各种存储引擎之间的差异。常见的存储引擎有InnoDB、MyISAM、Memory,现在最常用的是InnoDB,也是从MySQL5.5版本开始成为默认的存储引擎,在5.5之前默认的是MyISAM

2. 连接器

连接器是MySQL Server层的第一个模块,也是处理客户端请求的模块,连接器负责跟客户端建立连接、获取权限、维持和管理连接。

  • 登录命令
mysql -h$ip -P$port -u$user -p
# 或者
mysql -h$ip -P$port -u$user -p$password
  • 如果账号密码错误,会提示:Access denied for user

在这里插入图片描述

如果登录认证通过,会查询当前用户下的权限,之后用户的任何操作都是在这个权限范围内,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。

3. 查询缓存

查询缓存在 MySQL5.7.20 版本已过时,在 MySQL8.0 版本中被移除,这里作为了解即可。

MySQL 查询缓存存储客户端请求的查询结果信息( SELECT 语句)。MySQL 服务器在接收到相同的请求时,会直接将查询缓存中的结果返回给客户端,不再去数据库中重新查询。而且,查询缓存是在多个会话中共享的,一个客户端的查询缓存结果可以被另一个客户端的相同请求复用,从而加快了查询效率。

缓存以key-value的形式存储,存放在一个引用表中,key是通过一个哈希值的引用,这个哈希值包括查询本身(sql),当前要查询的数据库,客户端协议的版本等一些其他会影响返回结果的的信息;查询结果作为value(任何字符上的变化,例如空格,注释都会导致缓存不命中)。

如果表被更改,所有的缓存都将失效,表的更改是指数据的改变和表结构的改变,包括INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等。

对于数据经常变更的数据库来说,缓存命中率是很低的,这时查询缓存就是弊大于利,所以不建议使用缓存;而对于那些长时间不变、查询频率很高的数据,可以采用Redis缓存。

4. 分析器

我们根据MySQL语法编写一条SQL语句交给Server层以后,分析器会对SQL进行词法分析和语法分析。

已如下SQL为例:

select id,name from `tab`;
  • 词法分析

SQL语句是由多个字符串和空格组成的,MySQL的分析器需要识别里面的字符串分别是什么,代表什么。
MySQL从 “select” 关键字分析出这是一个查询语句,把字符串识别成 “tab” 表 ‘tab’,把字符串 “id,name” 识别成列 ‘id’,‘name’。

  • 语法分析

根据词法分析的结果,语法分析器会根据语法规则,判断你输入的SQL语句是否满足MySQL语法。

mysql> elect id,name from tab;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect id,name from tab' at line 1

一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接 “use near” 的内容。

5. 优化器

经过分析器生成的语法树被认为是合法的,交由优化器转化成执行计划。

MySQL判断出了一条SQL语句要做什么之后,对其进行各种优化,包括重写查询语句、选择合适的索引、表的读取顺序等等。

MySQL的优化器是基于成本的优化,尝试预测一个查询使用某种执行计划的成本,进而选择最小的那个。例如:表中有多个索引的时候决定使用哪一个、使用联合索引的时候根据索引调整where条件的顺序、多表关联(join)的时候,决定各个表的连接顺序等等。

如果想知道优化器是怎么进行优化决策的,可以通过explain获取优化的信息,explain具体的使用和解释后面章节会说明的。

6. 执行器

语句经过优化后,就要进入执行阶段,开始执行的时候,要先判断权限,如果没有,就返回没有权限的错误。如果有权限,就调用存储引擎的API操作数据。

在这里插入图片描述

6. 总结

用一条SQL语句的执行过程来总结一下:

在这里插入图片描述

  1. 去数据库连接池中获取一条数据库连接;

  2. 获取连接后把SQL语句发给数据库服务;

  3. 数据库服务负责监听网络事件接收到消息后交给SQL接口,SQL接口基于通信协议解析出SQL语句;

  4. 将解析出来的语句交给SQL解析器,解析出SQL语句要做的事情并提供所有方案;

  5. 查询优化器根据解析出的信息,优化出最佳的查询路径;

  6. 将优化后的查询路径交给SQL执行器去执行;

  7. 执行器调用存储引擎接口执行最优路径;

  8. 存储引擎在被执行器调用的过程中负责去访问内存和磁盘完成数据的更新等操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL - 一文了解MySQL的基础架构及各个组件的作用 的相关文章

  • 不使用sequelize模型存储updatedAt

    当我将模型存储在 MySQL 数据库中时 它们是不可变的 因此 我可以在表中看到对createdAt列的需要 但我不需要冗余的updatedAt列 我可以将sequelize 配置为不存储updatedAt time 然后可以从表中删除该列
  • 带有条件的多个表的 mySQL Left Join

    我有个问题 我有4张桌子 Invoice Payment 发票 客户和日历 基本上 我有下面的查询 它运行良好 除了没有 date due 的月份不会返回 即仅返回包含 date due 的月份 注意 日历表仅列出一年中的每一天 它包含一个
  • Laravel 5.4 合并两个集合

    所以我有两个收藏 sales and costs 现在我需要将它们合并为我的一个集合foreach状况 我不确定是否可以在一个集合中使用两个集合foreach 原始查询 Raw MySQL Queries for Sales total s
  • 如何在 JPA 2 / Hibernate 中进行可移植和本机 ID 生成?

    我希望在当前运行 Hibernate 和 MySQL 的 JPA 2 实体上生成本机和可移植的 ID 当使用 GenerateValue strategy AUTO 时 hibernate 默认为 MySQL 上的 hibernate se
  • 获取正确的 JSON 格式

    所以我试图创建一个 JSON 对象 它应该为我保存一些有关某些问题的信息 这是我希望如何呈现它的伪代码 page 1 info id 1 type 3 description How to do JSON alternatives id 1
  • 在react中使用Fetch,需要用户名密码才能访问数据库

    我已经对此进行了数小时的研究 但找不到我需要的答案 很抱歉 如果有人问这个问题 而我的研究很糟糕 如果是这样 只需链接有用的堆栈溢出页面 我就会继续我的快乐之路 这是我的问题的摘要 我在CS4班 我们正在设计自己的网页 必须使用我们学校的服
  • 如何左连接或内连接表本身

    例如 我将这些数据存储在表中 id name parent parent id 1 add self 100 2 manage null 100 3 add 10 200 4 manage null 200 5 add 20 300 6 m
  • 在 Python 中捕获 MySQL 警告

    我想用 Python 捕获并记录 MySQL 警告 例如 如果您提交 MySQL 会向标准错误发出警告 DROP DATABASE IF EXISTS database of armaments 当不存在这样的数据库时 我想捕获并记录它 但
  • 需要使用同一数据库中另一表的数据填充一个表

    我正在尝试使用 mysql 从另一个表填充一个表 第一个表是用户 第二个表是技术人员 用户包含 用户ID 姓氏 名字 登录ID 密码 访问级别 技术人员包含 techID tech surname tech firstname tech l
  • PHP PDO 和 MySQLi [重复]

    这个问题在这里已经有答案了 我刚刚完成了 PHP 入门课程 整个 stackoverflow 论坛上的人们都建议我切换到 PDO 准备好的语句或 MYSQLi 我简单地检查了手册 但其中大部分内容都超出了我的理解范围 到目前为止我一直在使用
  • PHP MySQL 仅当 IP 是新时才更新列

    我试图让我的脚本在每次 IP 出现新值时将观看次数更新 1 604800秒后 如果同一用户 同一IP 在604800秒后再次回来 则查看计数 1 有人可以帮我吗 Get video id id GET id Get video title
  • 如何扩展 Joomla!到我的自定义 PHP 文件

    我有一个我创建的 php 文件 我想扩展所有的 Joomla 类到该文件 或者我至少希望能够使用 Joomla 的类来访问我的 PHP 文件中的数据库 我怎样才能以这种方式扩展功能 提前致谢 将这些行放在 php 文件的顶部 define
  • System TZ 和 DB TZ 之间的时区感知差异?

    我目前正在将数据库从本地 MySQL 主机迁移到 RDS 中的 Aurora 使用以下命令检查两个系统上的时区设置 SELECT system time zone global time zone session time zone NOW
  • MYSQL通过两个键内连接两个表

    我正在执行查询以返回存储在 sb carts 表中的所有用户购物车 存储在 sb carts 中的产品信息通过两个键 Product sku 和 school id 引用 它需要参考两者来返回具有独特库存水平等的独特产品 当我执行以下查询时
  • 从MySQL插入查询中获取新记录主键ID?

    假设我正在做一个 MySQLINSERT进入我的一张桌子 该桌子有一列item id设置为autoincrement and primary key 如何让查询输出新生成的主键的值item id在同一个查询中 目前我正在运行第二个查询来检索
  • MySQL - 基于日期加入

    是否可以根据同一日期连接两个表 而不考虑时间 就像是 从预约左侧加入销售 约会 日期 销售 日期 唯一的问题是它是一个日期时间字段 所以我想确保它只查看日期并忽略时间 你可以这样做 FROM appointments LEFT JOIN s
  • 命令“python setup.py Egg_info”在 /tmp/pip-install-fs0wmmw4/mysqlclient/ 中失败,错误代码为 1

    当我在 Ubuntu 16 04 中输入以下命令时 pip install mysqlclient 我收到以下错误 enter code here Collecting mysqlclient Downloading https files
  • Ubuntu:无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地 MySQL 服务器 (2)

    我有 Ubuntu 14 04 安装了 LAMP 并运行 Owncloud 的服务器 我尝试安装文书工作 https github com twostairs paperwork wiki Installing Paperwork on U
  • 从 MySQL 将数字数据加载到 python/pandas/numpy 数组的最快方法

    我想从 MySQL 表中读取一些数字 双精度 即 float64 数据 数据大小约为 200k 行 MATLAB 参考 tic feature accel off conn database c fetch exec conn select
  • ImportError:没有使用 Python3 的名为 mysql.connector 的模块?

    尝试导入python mysql connector on Python 3 2 3并收到奇数堆栈 我怀疑我的 ubuntu 12 04 安装配置错误 vfi ubuntu usr share pyshared python3 Python

随机推荐

  • vi下显示和处理回车换行符等特殊符号

    http blog sina com cn s blog 4c76784c0100uaf9 html 换行方式 在早期的打印机时代 开始新的一行要占用两个字符的时间 如果到了一行的结尾处 你要快速回到新的一行的开头 需要打印针头在纸面上飞快
  • Android入门(五)

    文章目录 Activity 的状态及生命周期 实现管理生命周期 FirstActivity SecondActivity DialogActivity 运行结果 旧活动被回收了还能返回吗 Activity 的状态及生命周期 Android
  • 微信小程序生成分享图然后保存图片分享朋友圈

    微信小程序可以实现快速的转发好友实现分享 但是不能直接分享到朋友圈 但是有需要要这么做 要怎么实现呢 查看文档之后 大概有了实现思路 1 使用微信小程序的wx createCanvasContext 方法 绘制图片 2 使用wx canva
  • centos8 yum源配置

    1 手动配置网卡 nmcli connection modify ens160 connection autoconnect yes nmcli connection modify ens160 ipv4 method manual ipv
  • CSS层叠样式表(一)

    在学习完HTML之后我们就会进入到一个新的阶段 就是CSS层叠样式表的学习 通过使用 CSS 我们可以大大提升网页开发的工作效率 在本篇文章当中 您会了解到如何使用 CSS 同时控制多重网页的样式和布局 更重要的是在本篇文章中会对CSS选择
  • 如何转换为 Win32 FILETIME 或 SYSTEMTIME 的 UNIX time_t

    在 UNIX 平台下名为 time t 表示 1970 年 1 月 1 UTC 协调通用时间 午夜以来经过的秒数是 ANSI C 运行库算术类型的窗体中维护文件的时间 在 Win32 平台下主要中表示的数自 1601 年 1 月 1 UTC
  • Python语言:求水仙花数案例讲解

    求水仙花数是循环和判断语句相结合的一个经典案例 思路分析 通过循环遍历100到999之间的数字然后根据他们的个位 十位 百位上的数字立方和是否为他本身来判断分析得出什么数是水仙花数 1 如何循环遍历100到999的所有数字 使用while循
  • u8客户端怎么修改服务器ip,u8服务器ip地址在哪修改

    u8服务器ip地址在哪修改 内容精选 换一换 在Mind Studio所在服务器上配置路由规则 允许转发开发者板的IP报文 开发者板上则需要配置一下路由地址 即Mind Studio所在服务器的IP地址 Mind Studio所在服务器侧配
  • STM32F4_nRF24L01无线通讯

    目录 前言 1 nRF24L01无线模块简介 2 nRF24L01状态机 3 nRF24L01模式 4 nRF24L01的SPI配置 4 1 nRF24L01 Rx 和 Tx 的初始化配置 4 2 nRF24L01相关寄存器 5 硬件连接
  • Spark基础学习笔记:SparkSQL词频统计

    目录 一 使用Spark SQL实现词频统计 一 数据源 words txt 四 修改源目录名称 六 创建词频统计单例对象 七 启动程序 查看结果 一 使用Spark SQL实现词频统计
  • 哥斯拉jsp马分析

    前言 这篇文章分析了哥斯拉jsp马的特征原理 写这篇文章的初衷在提高对哥斯拉马的识别 改造能力 笔者接触安全的时间较短 难免会有疏漏 恳请发现问题的大佬给予指正 哥斯拉PHP马解析可以看这篇文章 https blog csdn net ze
  • python3 题解(28 级数法求圆周率)

    级数法求圆周率 问题 圆周率是十分重要的常数 它是个无理数 无法表示为有限小数的形式 但 我们可以表示它的近似值 可以用无穷级数去逼近它 pi 的级数公式十分多 下面给出3个较简单的 2 6 1 1 2 1 2 2 1 3 2 frac p
  • 经纬高(LLA)坐标系地心地固(ECEF)坐标系与东北天(ENU)坐标系转换

    前段时间在做水下机器人项目 添加了RTK 读取到的数据为经纬高坐标系中度分形式的经纬度信息 无法直接用于定位 还需要进行坐标系的转换 后来在学习Cartographer时处理GPS数据也有提到这方面的知识 于是决定汇总到一起进行学习 下文将
  • HTML文本格式化

    目录 HTML 文本格式化实例 如何查看 HTML 源码 文本格式化标签 计算机输出 标签 引用 引用和术语定义 延伸阅读 一个完整的实例 HTML 可定义很多供格式化输出的元素 比如粗体和斜体字 下面有很多例子 可以亲自试试 HTML 文
  • SpringMVC中Controller层注解扫描

    SpringMVC中Controller层扫描 方式一 方式二
  • mysql基于Java web的电动车销售平台毕业设计源码201524

    电动车销售平台的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径 但是途径的扩展基本上为人们所努力的方向 由于站在的角度存在偏差 人们经常能够获得不同类型信息 这也是技术最为难以攻克的课题 针对电动车销售平台等问题 对电动车销售
  • 论文研读:SuperGlue vs. LoFTR

    简介 SupeGlue与LoFTR都是对图片间进行特征点匹配的方法 其目的是 找到图像A 图像B中同时存在的相同物体实例 并输出其位置信息 匹配关系 在提取出特征点后 我们通过图神经网络生成匹配代价矩阵 并求解最优匹配矩阵 以获得全局最优的
  • 1.3 起步 - Git 基础

    1 3 起步 Git 基础 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 18 初稿 目录 文章目录 1 3 起步 Git 基础 版本说明 目录 Git 基础 1 直接记录快照 而非差异比较 Figure 4 存储每个文
  • python报错:ValueError: not enough values to unpack

    报错 ValueError not enough values to unpack 分析具体原因 这个错误的信息是 期望有7个返回值 但其实函数只有4个返回值 解决方法 检查函数和接收函数返回值的参数个数是否一致 改成一致即可
  • MySQL - 一文了解MySQL的基础架构及各个组件的作用

    1 概述 不管是开运 运维 测试 都或多或少的要接触MySQL 了解MySQL的基础架构及各个组件之间的关系 有助于我们更加深入的理解MySQL 下面由一张MySQL基础架构图来一起走进MySQL MySQL可以基本划分为Server层和存