没有客户端执行mysql_重学MySQL:谈一谈MySQL架构

2023-11-17

作为一名Web后端程序员,需要经常与MySQL打交道,不过更多的时候还是停留在增删改查(CURD)的应用层面,然而随着负责项目的数据量增长和服务器硬件性能开始出现瓶颈,让我感觉有必要更加全面深入地学习与了解MySQL,以便更好地发挥MySQL的性能和提高使用MySQL的能力。

01 MySQL整体架构

与所有服务端软件一样,MySQL采用的也是C/S架构,即客户端(Client)与服务端(Server)架构,我们在使用MySQL的时候,都是以客户端的身份,发送请求连接到运行服务端的MySQL守护进程,而MySQL服务器端则根据我们的请求进行处理并把处理后的结果返回给我们,这个过程可以简单地抽像成下面的示意图:

1.1 客户端(Client)

在安装后MySQL之后,在其安装目录的bin目录下,有一个mysql命令,这就是一般我们所说的MySQL客户端,不过这是MySQL官方提供的命令行客户端。

在shell输入mysql命令,便可以开始连接MySQL服务器了,如下:

$ mysql -u root -pEnter password:*******

输入密码之后,便进入如下所示的MySQL客户端交互界面:

Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 25338 to server version: 5.7.29-standardType 'help;' or 'h' for help. Type 'c' to clear the buffer.mysql>

上面的箭头表示等待输入,这就是说,我们可以发MySQL服务器发送各种语句了。

输入q,exit,quit则可以退出客户端,如:

mysql>exitBye

除了MySQL原生的命令行客户端,其实更常用的还有一些GUI客户端,比如我们比较用的Navicat,另外还有各种编程语言提供的访问MySQL的类库,其实都是连接到MySQL的客户端。

1.2 服务端(Server)

上面的示意图可能太过于抽象和简单,再深入到MySQL服务器的内部,我们可以使用下面的示意更加详尽地描述整个MySQL的逻辑架构:

我们所说的MySQL其实更多的时候是指MySQL服务端,MySQL服务端是负责响应客户端请求的守护进程。

在MySQL安装目录下运行下面的命令便可以启动MySQL服务器守护进程,不过一般我们不采用这种方式,而是使用系统服务的方式启动MySQL守护进程。

$ bin/mysqld

从上面的示意图可以看出来,MySQL的服务端大体上可以分为Server层和存储引擎层,而Server层分别为连接管理、解析与优化、查询优化器和执行器,而Server层与存储引擎之间的交互则通过统一的API进行调用,下面我们来详细了解MySQL Server的各个组件的功能与作用。

1.2.1 连接管理器

连接管理器的作用是管理和维持所有MySQL客户端的请求连接,当我们向MySQL发起请求时,连接管理器会负责创建连接并校验用户的权限。

对于已经建立的连接,如果没有太久没有发送请求,连接管理器会自动断开连接,我们可以通过设置变量wait_timeout决定多久断开不活跃的连接。

1.2.2 查询缓存

当我们与连接器建立连接后,如果我们执行的是SELECT语句,那么连接器会先从查询缓存中查询,看看之前是否执行过这条语句,如果没有再往走,如果有则判断相应的权限,符合权限,则直接返回结果。

查询缓存其实是把查询语句当作一个key,查询结果当用value,建立起来的key-value缓存结构。

不过,当数据表的数据发生变化时,其所对应的查询缓存则会失败,因此很多时候往往不能命中查询缓存,所以一般建议不要使用查询缓存。

mysql> select SQL_CACHE * from users where uid = 1000;

可能MySQL官方团队也意识到查询缓存的作用不大,在MySQL 8.0版本中已经将查询缓存的整块功能删掉了,所以如果你用的是MySQL 8.0的版本,查询缓存的功能就不存在了。

1.2.3 解析器

当在查询缓存中没有命令查询时,则需要真正执行语句,这时候就交给解析器先进行词法分析,对我们输入的语句进行拆解,折解后再进行语法分析,判断我们输入的语句是不是符合MySQL的语法规则,如果输入的语句不符合MySQL语法规则,则停止执行并提示错误。

比如我们输入下面的错误语句:

select * users

由于上面的语句少了from,所以会返回下面的错误提示:

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 'users' at line 1

1.2.4 查询优化器

我们输入的语句,经过分析器的词法和语法分析,MySQL服务器已经知道我们要查询什么了,不过,在开始查询前,还要交由查询优化器进行优化。

在优化的过程,优化器会根据SQL语句的查询条件决定使用哪一个索引,如果有连接(join),会决定表的查询顺序,最终会根据优化的结果生成一个执行计划交由下面的执行器去执行。

1.2.5 执行器

SQL语句在经过查询优化器的优化后,接下来就交由执行器开始执行,不过执行器在开始执行前,会判断用户对相应的数据表是否有权限。

如果用户有权限,则开始调用数据,与其数据库不同的,MySQL的数据存储与调用交由存储实现,当我们调用时,执行器通过存储引擎API向底层的存储发送相应的指令,存储引擎负责具体执行,并将执行结果告诉执行器,然后再返回给客户端。

1.2.6 存储引擎

存储引擎,也叫做表类型,其具体作用便是决定一个数据表怎么处理和存储表中的数据,MySQL支持多种不同的存储引擎,而且存储引擎被设计为可插拔式的,在同一个数据库中,不同的数据表可以使用不同的存储引擎。

Innodb是MySQL的默认存储引擎,也是常用的存储引擎,另外比较常用的存储引擎还有MyISAM和Momery。

(1)查询支持的存储引擎

在连接到MySQL服务端之后,我们可以使用下面的命令查询当前MySQL服务器支持的存储引擎:

mysql > show engines

上面语句的执行结果,如下表所示:

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine | Support | Comment | Transactions | XA | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES || MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO || MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO || BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO || MyISAM | YES | MyISAM storage engine | NO | NO | NO || CSV | YES | CSV storage engine | NO | NO | NO || ARCHIVE | YES | Archive storage engine | NO | NO | NO || PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO || FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+9 rows in set (0.00 sec)

从上面的表格中,可以看出我本地的MySQL支持9种存储引擎,上面表格中,Engine列显示的是存储引擎的名称,Support列说明该引擎是否可用,DEFAULT则说明该引擎为默认引擎,Comment是该引擎的说明,Transactions列用于说明存储引擎是否支持事务,XA列说明该存储引擎是否支持分布事务,Savepoints列说明存储引擎是否支持部分事务回滚。

(2)指定存储引擎

Innodb是MySQL的默认存储引擎,这意味着,如果你在创建数据表的时候没有指定存储引擎,则默认使用Innodb,而下面的语句,则演示了在创建数据表时,重新指定存储引擎,如下面的users数据表,我们使用了MyISAM存储引擎。

mysql> CREATE TABLE users( -> uid int not null, -> username varchar(32) not null, -> email varchar(64) not null, -> gender tinyint not null, -> primary key(uid) -> )engine=MyISAM -> ;

(3)修改表的存储引擎

对于已经创建好的数据,也可以通过下面的语句修改其存储引擎:

ALTER TALBE 数据表名称 ENGINE=存储引擎的名称

比如我们把users表的存储引擎从MyISAM改为InnoDB

ALTER TABLE users ENGINE=InnoDB;

02 小结

“不畏浮云遮望眼,自缘身在最高层”,对MySQL基础架构的学习与了解,让我们可以站在最高处,有助于我们鸟瞰MySQL的全貌,了解MySQL的整体运行情况,让我们可以从全局思考如何解决问题,而不是局限于某个方面。

原文链接:https://juejin.im/post/5d74f7db6fb9a06ae7642c2a#heading-0

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

没有客户端执行mysql_重学MySQL:谈一谈MySQL架构 的相关文章

  • Solidity合约中Merkle Root验证的一点实践

    背景 在上一篇文章 Solidity合约中签名验证的一点实践 中提到过 白名单机制一般有两种 除了签名验证的方式外 就是本文讲述的Merkle Root验证的方式 主要做法是在服务端对白名单地址列表整体构建Merkle树 计算出树的root
  • 解决Hbase报错java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for....

    完整报错为 java lang IllegalStateException The procedure WAL relies on the ability to hsync for proper operation during compo
  • set的使用

    创建集合 set 1 2 3 4 转化为列表list 1 如果我要在许多列表中找出相同的项 那么用集合是最好不过的了 用集合只用一行就可以解决 x y z 交集 2 去重 gt gt gt lst 1 2 3 4 1 gt gt gt pr
  • 毕业那天我们一起失恋

    毕业那天我们一起失恋 原载 婚姻家庭 VOL 1大四快开学了 我提前了几天来学校 俗话说 磨刀不误砍柴功 我提早来学校 把床铺好 把蚊帐挂起来 把厕所弄干净 把寝室打扫一下 寝室里只有我做这种打扫的事情 寝室有三个人 我一个 丸子一个 还有
  • 【翻译】对计算机未来的10个预测或;我们的首席科学家的无稽之谈

    TLDR WASM将无处不在 编译目标 部署目标 物联网 插件生态系统 这已经在发生了 1 5年 Rust将继续流行 根据RedMonk的指数 在未来几年将超过Go 2 4年 将出现一个严重的Kubernetes的对手 如果它使用WASM并
  • 写个爬虫吧

    import requests url https image baidu com search acjson tn resultjson com ipn rj ct 201326592 is 0 2C0 fp detail logid 1
  • 03-MySQL数据类型

    一 数值类型 整数 MySQL 主要提供的整数类型有 TINYINT SMALLINT MEDIUMINT INT BIGINT 浮点数 浮点类型有两种 分别是单精度浮点数 FLOAT 和双精度浮点数 DOUBLE 定点类型 只有一种 就是
  • 记录一次 JS 解密去混淆的经历 -- 如何破解加密的 JS 代码(一)

    写在前头 昨天发了一个 某JS最牛加密脱壳解密破解去混淆工具 有朋友说上代码不如讲一下思路 于是今天准备捋一下这个思路 顺便当整理复习了 需要直接解密代码的请看上一篇文章 这里只有思路与过程 阅读此文默认你有一定的 JavaScript 基
  • vscode工作区同时显示多个文件

    有时候安装的vscode打开一个文件又打开另一个文件只会保存新的文件 旧的文件别替换 这样做项目比较难受 所以用下面方法可以打开多个文件 workbench editor showTabs true
  • 【E2E】Tesseract5+VS2017+win10源码编译攻略

    一 记录我目前在win10 X64和VS2017的环境下成功编译Tesseract5 0的方式 二 记录在VS2017 C 工程中调用Tesseract4 0的方法 三 记录编译和调用Tesseract4 0过程中踩到的坑和相应的解决方案或
  • IMU立大功:有效减小建筑工人高空坠落风险

    尽管建筑行业不断努力改善工作场所安全 但它仍然是全球最危险的行业之一 建筑行业的工作死亡或致命工伤比例为25 在这些致命伤害中 大约36 是由高空坠落造成的 这是建筑行业从业者意外死亡的主要原因之一 其他国家 包括澳大利亚 中国和韩国 也因
  • 使用eclipse创建JAVA项目

    打开eclipse软件 选择好工作区域 就是项目的储存地址 后登陆 File New Project 选择 Java Project 输入项目名称 点击Finish SRC是专门放java源代码的文件夹 就是你在IDE里编写的各个java类
  • C语言上机实验思路分享9

    实验项目名称 实验十 C 文件基本操作 实验目的及要求 1 掌握文件和文件指针的概念以及文件的定义方法 2 了解文件打开和关闭的概念和方法 3 掌握有关文件操作的函数 实验内容 方法和步骤 1 文件 stu info1 txt 包含学生的基
  • 模板型模板参数报错,无法调试通过,---《深入实践c++模板》例子

    include
  • 迪杰斯特拉算法求图的某个顶点到其他顶点的最短路径问题

    迪杰斯特拉算法 使用图的广度优先遍历算法 比如先从G点出发 找到能与G直接连接的顶点 然后才从与G最近的A出发 找到与A相邻的节点 通过比较G到每个顶点的距离大小 筛选出到每个点的最短路径 代码 迪杰斯特拉算法球最短路径问题 public
  • hdu 3966 Aragorn's Story

    Problem acm hdu edu cn showproblem php pid 3966 Reference 树链剖分 树链剖分原理 树链剖分详解及模板 HDU3966 树链剖分 Meaning 一棵 n 个点的树 每给结点有个值 三
  • BERT、BART、T5 等法学硕士的比较分析

    探索语言模型 介绍 在这篇博文中 我将讨论 BERT BART 和 T5 等大型语言模型 到 2020 年 法学硕士领域取得的重大进展包括这些模型的开发 BERT和T5是Google开发的 BART是Meta开发的 我将根据这些型号的发布日
  • css实现水平居中

    代码示例 div class box div class box1 div div 1 弹性布局 推荐 display flex 这些要添加在父级的 是父级的属性 父级添加display flex 父级添加justify content c
  • Zookeeper 基本操作

    Zookeeper 基本操作 文章目录 Zookeeper 基本操作 1 查看zk的运行状态 2 客户端连接zk 3 ls 查看 4 get 获取节点数据和更新信息 5 stat 获得节点的更新信息 6 ls2 ls命令和stat命令的整合

随机推荐

  • java localdate mysql_如何使用JDBC从java.sql.Date获取LocalDateTime对象?

    Java8的java time包提供了一个名为LocalDateTime的类 用于获取本地日期和时间的当前值 除日期和时间值外 还可以使用此字段来获取其他日期和时间字段 例如 一年中的某天 一周中的某天和一年中的某周 将java sql D
  • DIY简单的RTOS(一)

    说明 在看了很多关于RTOS的文章 一直想做一个简单的RTOS 苦于现有资料非常少 在看了很多关于现有RTOS的底层实现 再结合相关文章 完成一个简单的RTOS demo 代码难免有不合理之处 仅当个人学习做笔记使用 项目代码 什么是RTO
  • opencv图像的基础操作

    读取图像 cv imread 参数 要读取的图像 读取 式的标志 cv IMREAD COLOR 以彩 模式加载图像 任何图像的透明度都将被忽略 这是默认参数 cv IMREAD GRAYSCALE 以灰度模式加载图像 cv IMREAD
  • osgEarth的Rex引擎原理分析(五十一)osg::Program与osgEarth::VirtualProgram的关系

    目标 四十五 中的问题113 osgEarth VirtualProgram在apply时用到了osg Program 也就是VirtualProgram最终是要通过osg Program实现着色器功能 只不过VirtualProgram中
  • AI工具究竟是帮手还是对手?你怎么看,一起来聊聊吧!

    AI工具究竟是帮手还是对手 你怎么看 一起来聊聊吧 1 你现在正在哪个领域学习或工作呢 你用过哪些AI智能工具 2 作为行业人士或正在学习的学生 你认为AI工具的出现会提升你的工作或学习效率吗 3 对于AI智能工具的出现 我们应该做好哪些准
  • 51单片机(十四)—— 中断功能介绍

    中断是单片机的一个重要功能 本文我们就对51单片机的中断进行介绍 所谓 中断 通俗一点讲 就是单片机停止正在执行的任务 转去执行其它的急需解决的任务 当这个任务完成之后 在回到原来的任务继续执行 中断就是为了使单片机能够对外部或内部随机发生
  • Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]

    对呀对呀 回字有四样写法 你知道么 当时鲁大大如此讽刺孔乙己 意味着老孔这个被科举制毒害的人注意此种无用之物实在可悲 但是在Angular 2的世界中 很少存在无用之物 ngModel有三种写法 你知道吗 表单的设计永远都是应用的重头戏 而
  • HmacMd5加密算法

    package com haiyisoft evportal token action import java security MessageDigest import java security NoSuchAlgorithmExcep
  • java通配符有哪些

    java通配符有哪些 1 通配符 代表未知类型 代表不关心或无法确定实际操作的类型 一般与容器类配合使用 JavaScript public void testV List
  • ax = fig.gca(projection=‘3d‘)报错的解决方法

    最近在学习tensorflow 其中有使用matplotlib画一个3d图像的练习 跑代码时遇到以下问题 TypeError FigureBase gca got an unexpected keyword argument project
  • Java eclipse 错误:For input string

    1 错误描述 For input string 类路径 2 什么意思 参考资料可知 For input string 表示数据类型转换错误 当一个数据类型使用 toString 方法进行转换成字符串时 转换失败就会报这个错误 3 排除错误
  • 错误 无法使用未定义类型“Ui::MainWidow“

    一 问题分析 在Qt Creator中创建Qt项目时 Creator会自动给你声明一个命名空间Ui namespace Ui class MainWindow 这是命名空间Ui里的一个类 类名是MainWindow 和你声明的MainWin
  • 安卓4.4手机运行崩溃,类无法找到,实际却是存在

    java lang RuntimeException Unable to get provider com SdkFileProvider java lang ClassNotFoundException Didn t find class
  • oracle-- 数据更新操作和事务操作

    一 sql语言操作分类 需要背 面试需要 1 数据定义语言DDL DATA DEFINE LANAGUAGE 定义 操作数据的结构 gt java的变量定义 CREATE 在数据库中创建新的数据对象 ALTER 修改数据库中对象的数据结构
  • redis:key设计原则

    redis与关系型数据库的适合场景 场景 书有标签 一本书可能有多个标签 一个标签可能对应多本书 如果是关系型数据库来存储 create table book id int title char 20 engine myisam chars
  • 以 STM32最小系统核心板(STM32F103C8T6)+面板板+LED 搭建电路,使用GPIO端口控制LED灯

    目录 STM32寄存器操作 寄存器的定义 寄存器操作GPIO 点灯 打开GPIO口的时钟 初始化GPIO口 选择推挽输出 设置低电平 实践操作 keil生成 hex 电路连接 芯片 烧录 总结 STM32寄存器操作 寄存器的定义 寄存器是存
  • Stable Diffusion web UI 安装教程

    Stable Diffusion web UI 安装教程 欢迎来到猫说AI wx搜索 猫说AI接入了最新版Chatgpt供大家免费使用 注意 这是ubuntu20 04安装步骤 conda创建python虚拟环境 conda create
  • pom报错,但不提示错误

    1 删除工作空间文件 workspace projects metadata plugins org eclipse m2e jdt 项目名称 container
  • Java获取指定日期的0点以及24点

    指定Date date 比如是 2022 12 09 12 34 28 获取这天的开始时间和结束时间 获得某天最大时间 2022 12 09 23 59 59 public static Date getEndOfDay Date date
  • 没有客户端执行mysql_重学MySQL:谈一谈MySQL架构

    作为一名Web后端程序员 需要经常与MySQL打交道 不过更多的时候还是停留在增删改查 CURD 的应用层面 然而随着负责项目的数据量增长和服务器硬件性能开始出现瓶颈 让我感觉有必要更加全面深入地学习与了解MySQL 以便更好地发挥MySQ