MySQL系列:一句SQL,MySQL是怎么工作的?
对于MySQL而言,其实分为客户端与服务端。
服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端。
客户端,负责发送请求到服务端并从服务端获取数据,客户端可以有多种形式,可以是我们通过mysql -uroot -p1234打开的黑窗口,也可以是我们使用的Nativecat、SQLyog等数据库连接工具,甚至我们的程序,也可以称作MySQL的客户端。
而当我们在mysql窗口或者数据库连接工具中输入一句sql后,我们就可以获取到想要的数据,这中间MySQL到底是怎么工作的呢?
在我们执行SQL后,例如一句简单的select * from user where name = ‘yanger’,客户端发送请求到服务端,请求到达Server层,会经过连接器、查询缓存、分析器、优化器、执行器等,最终通过存储引擎从文件系统获取数据或者插入数据到文件系统。
连接器
在客户端程序发起连接的时候,需要携带主机信息、用户名、密码,服务器程序会对客户端程序提供的这些信息进行认证,如果认证失败,服务器程序会拒绝连接。
连接命令大家都比较熟悉。
mysql -h$ip -P$port -u$user -p
输完命令之后,需要继续输入密码,密码也可以直接跟在 -p 后面,但这样可能会导致你的密码泄露,如果你连的是生产服务器,强烈建议你不要这么做。
MySQL采用TCP作为服务器和客户端之间的网络通信协议,完成 TCP 握手后,连接器主要做密码校验和权限获取。
如果用户名或密码不对,你就会收到一个"Access denied for user"的错误
如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限
MySQL的默认连接是8小时,由参数 wait_timeout 控制的,如果超过这个时间不使用,会自动断开,并在之后的操作中,抛出Lost connection to MySQL server during query的错误。
查询缓存
针对于查询语句,MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句,之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。如果命中缓存,将直接返回结果。如果不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。
针对于更新语句,包含插入删除语句,MySQL 收到更新请求时,会把查询缓存中该表相关的缓存数据全部清空。
我们可以看到,只要有更新,缓存就会失效,而对于正常的业务,更新其实是比较频繁的,也就是说,其实MySQL的查询缓存命中率并不会很高,所以建议一般不到开启。
可以通过设置 query_cache_type 为 DEMAND 来关闭查询缓存功能。而事实上,在 MySQL 8.0 版本,更是直接移除了查询缓存这一个功能。
分析器
MySQL 首先需要对SQL语句进行分析,分析过程本质上算是一个编译过程,涉及词法解析、语法分析、语义分析等阶段,通过分析MySQL知道自己要做什么。
如果语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。
优化器
面对分析器拿到的结果,MySQL会做一些优化处理,例如在表里面有多个索引的时候,决定使用哪个索引,或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。我们可以使用EXPLAIN语句来查看某个语句的执行计划。
这里\G在命令窗口无法一行时,可以竖着展示结果,方便查看。
执行器
经过了分析器和优化器,就正式进行执行阶段了,不过执行之前,需要做权限验证,如果权限不足,就会抛出权限的错误。其实在查询缓存的时候,一样也会进行权限校验。
如果通过验证,执行器就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
存储引擎
MySQL支持非常多种存储引擎,常用的是InnoDB和MyISAM,MySQL的默认存储引擎是InnoDB。
假如我们选择是InnoDB引擎,对于查询,那InnoDB 会取这个表的第一行来进行判断是不是符合要求,符合则存在结果集中,否则继续进行下一行,直到该表的最后一行。
然后存储引擎将结果返回给执行器, 执行器拿着结果返回给客户端,这样一句SQL就执行完成了。
MySQL系列:一句SQL,MySQL是怎么工作的?的更多相关文章
- MySQL系列(二)---MySQL事务
MySql 事务 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 什么是事务(transaction) 保证成批操作要么完全执行,要么完全不执行,维护数据的完整性.也 ...
- Mysql系列(三)—— Mysql主从复制配置
一.前言 主从复制是Mysql知识体系中非常重的要一个模块.学习主从复制和后续的读写分离是完善只是知识体系的重要环节.且主从复制读写分离的思想并不仅仅局限于Mysql,在很多存储系统中都有该方案,如: ...
- MySQL系列-第一章节:MySQL介绍与安装
1.数据库介绍 1.1.什么是数据库`<Database>` 简单说存放数据的仓库,这个仓库按照一定的数据结构<数据结构是指数据的组织形式或数据之间的联系>来组织.存储的,我们 ...
- MySQL系列(一):谈谈MySQL架构
MySQL整体架构 与所有服务端软件一样,MySQL采用的也是C/S架构,即客户端(Client)与服务端(Server)架构,我们在使用MySQL的时候,都是以客户端的身份,发送请求连接到运行服务端 ...
- MySQL系列:Windows 下 MySQL 8.X 的安装
之前一直使用的是MySQL5.7,但由于MySQL增加了一些新特性,所以选择了更新. 下载MySQL 进入MySQL官网下载地址,选择Windows (x86, 64-bit), ZIP Archiv ...
- Mysql系列(四) —— MySQL的Charset和Collation
本文转载自:再见乱码:5分钟读懂MySQL字符集设置 一.内容概述 在MySQL的使用过程中,了解字符集.字符序的概念,以及不同设置对数据存储.比较的影响非常重要.不少同学在日常工作中遇到的" ...
- Mysql系列(二)—— Mysql支持的数据类型
Mysql版本众多,每个版本支持的数据类型繁多且不一样,本篇文章中主要基于MySQL Community Server 5.7.22介绍常用的数据类型,包括其特点以及区别. 一.数据类型 正确的定义表 ...
- mysql系列十二、mysql常用hint
对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的. 强制索引 FORCE ...
- Mysql系列(六)—— MySQL索引介绍
前言 索引种类 索引维护 如何使用索引 一.索引索引种类 MySQL中索引主要包含以下几种: 普通索引 唯一索引 主键索引 联合索引 全文索引 二.索引维护 在简述了索引的类型后,再来了解下如何维护索 ...
- MySQL系列:Docker安装 MySQL提示错误:Access denied for user'root'@'localhost' (using password:yes)
问题: 解决方法: 在my.conf文件里配置 [mysqld] skip-grant-tables
随机推荐
- python编程基础之三十四
面向对象:三大特征:封装,继承,多态 封装:隐藏对象的实现过程,对外仅仅公开接口,控制在程序中的读取和修改的访问级别 类,函数都是一种封装 属性私有化:当类里面的属性不想被外部访问,可以将这些属性设置 ...
- python编程基础之二
交互式: 此处以windows为例:开始->运行->cmd,输入python 交互式界面 优点:即时,所见即所得 缺点:代码不可复用,根本无法进行维护 退出:exit() 代码是顺序执行: ...
- SQL SERVER数据库多条件查询
例如:查询挂号超500的数据select CONVERT(VARCHAR(10),DGH,23),COUNT(*) from yxhis2017..VTBMZGHMX2017 where bth=0 ...
- Web安全之爆破中的验证码识别~
写爆破靶场的时候发现对于爆破有验证码的有点意思~这里简单总结下我们爆破有验证码的场景中几种有效的方法~~~ 0x01 使用现成工具 这里有pkav团队的神器PKAV HTTP Fuzzer 1.5.6 ...
- 什么是IDS/IPS?
目录 摘要 0x00 基于网络的IDS和IPS0x01 设计考虑因素0X02 IDS/IPS 总结 摘要 摘要 这篇文章主要介绍的是入侵检测系统(IDS)和入侵防御系统(IPS ...
- C#发送电子邮件(SMTP)及outlook.com账号之概要
这是关于c#发送电子邮件(SMTP)的技术笔记,以”简报“形式呈现. 因为最后成功通过outlook.com发送了邮件,所以,我觉得还是有必要 记录一下其中的要点. 一.技术核心 .net Frame ...
- LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组)
LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:h ...
- .NET Core 3.0 构建和部署
Default Executables 默认可执行文件 在 dotnet build 或 dotnet publish 期间,将创建一个与你使用的 SDK 的环境和平台相匹配的可执行文件. 和其他本机 ...
- [NOI2001]食物链(并查集拓展域)&& [HAOI2006]旅行(Kruskal)
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- TCP/IP和Socket开发经验分享
当前与网络相关的业务主要是基于tcp/ip或http,熟悉j2ee的同学一定会对http场景下的开发比较了解.但是,精通tcp/ip以及如何构建一个直接基于tcp/ip层通讯的知识却不太多见.恰巧,最 ...