MySQL是典型的C/S架构(客户端/服务器架构),客户端进程向服务端进程发送一段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。
问题来了。服务器进程对客户端发送的请求究竟做了什么处理呢?本文以查询请求为例,讲解MySQL服务器进程的处理流程。
如下图所示,服务器进程在处理客户端请求的时候,大致需要进行3个步骤:
处理连接
解析与优化
存储引擎
接下来我们来详细了解一下这3步具体都做了什么。

客户端向服务器发送请求并最终收到响应,本质上是一个进程间通信的过程。
MySQL有专门用于处理连接的模块——连接器。
TCP/IP协议是MySQL客户端和服务器最常用的通信方式。
我们平时所说的MySQL服务器默认监听的端口是3306,这句话的前提是客户端进程和服务器进程使用的是TCP/IP协议进行通信。
我们在使用mysql命令启动客户端程序时,只要在-h参数后跟随IP地址作为服务器进程所在的主机地址,那么通讯方式便是TCP/IP协议。
如果客户端进程和服务器进程位于同一台主机,且要使用TCP/IP协议进行通信,则IP地址需要指定为127.0.0.1,而不能使用localhost
如果客户端进程和服务器进程都位于类UNIX操作系统(MacOS、Centos、Ubuntu等)的主机之上,并且在启动客户端程序时没有指定主机名,或者指定的主机名为localhost,又或者指定了–protocol=socket的启动参数,那么客户端进程和服务器进程就会使用UNIX域套接字进行进程间通信。
MySQL服务器进程默认监听的UNIX域套接字文件为/temp/mysql.sock,客户端进程启动时也默认会连接到这个UNIX域套接字文件之上。
如果不明白UNIX域套接字到底是什么也没关系,只要知道这是进程之间的一种通讯方式就可以了,这里提及的主要目的是希望读者知晓MySQL客户端和进程通讯方式不止于TCP/IP协议
如果你的MySQL是安装在Windows主机之上,客户端和服务器进程可以使用命名管道和共享内存的方式进行通信。
不过使用这些通信方式需要在服务端和客户端启动时添加一些启动参数。
使用命名管道进行通信。需要在启动服务器时添加–enable-named-pipe参数,同时在启动客户端进程时添加–pipe或者–protocol=pipe参数
使用共享内存进行通信。需要在启动服务器时添加–shared-memory参数,启动成功后,共享内存便成为本地客户端程序的默认连接方式;也可以在启动客户端进程的命令中加上–protocol=memory参数明确指定使用共享内存进行通信
如果不明白命名管道和共享内存到底是什么没关系,只要知道这是进程之间的一种通讯方式就可以了,这里提及的主要目的是希望读者知晓MySQL客户端和进程通讯方式不止于TCP/IP协议
确认通信方式并且成功建立连接之后,连接器就要开始验证你的身份了,使用的信息就是你的用户名和密码。
如果用户名或者密码错误,客户端连接会立即断开
如果用户名密码认证通过,连接器会到权限表里面查出当前登陆用户拥有的权限。之后这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
每当一个客户端连接到服务端时,服务端进程都会创建一个单独的线程来处理当前客户端的交互操作。
那么如何查看MySQL当前所有的连接?

我故意拼错了SELECT关键字,MySQL报了语法错误,就是在语法分析这一步。

我们看一下不同存储引擎在底层存储方面的差异,首先找到MySQL的数据存储目录

不同的存储引擎存放数据的方式不一样,产生的文件数量和格式也不一样,InnoDB文件包含2个,MEMORY文件包含1个,MYISAM文件包含3个。
首先我们查看一下当前MySQL服务器支持的存储引擎都有哪一些。
其中,
Support表示该存储引擎是否可用;
DEFAULT表示当前MySQL服务器默认的存储引擎;
Transactions表示该存储引擎是否支持事务;
XA表示该存储引擎是否支持分布式事务;
Savepoints表示该存储引擎是否支持事务的部分回滚。
应用范围比较小,表级锁定限制了读/写的性能,因此在Web和数据仓库配置中,通常用于只读或以读为主的工作。
特点:
支持表级别的锁(插入和更新会锁表),不支持事务;
拥有较高的插入(insert)和查询(select)速度;
存储了表的行数(count速度更快)。
怎么快速向数据库插入100万条数据?
可以先用MylSAM插入数据,然后修改存储引擎为InnoDB。
MySQL 5.7及更新版中的默认存储引擎。InnoDB是一个事务安全(与ACID兼容)的MySQL 存储引擎,它具有提交、回滚和崩溃恢复功能来保护用户数据。InnoDB行级锁(不升级为更粗粒度的锁)和Oracle风格的一致非锁读提高了多用户并发性。InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的I/O。为了保持数据完整性,InnoDB还支持外键引用完整性约束。
特点:
支持事务,支持外键,因此数据的完整性、一致性更高;
支持行级别的锁和表级别的锁;
支持读写并发,写不阻塞读(MVCC);
特殊的索引存放方式,可以减少IO,提升査询效率。
番外:InnoDB本来是InnobaseOy公司开发的,它和MySQL AB公司合作开源了InnoDB的代码。但是没想到MySQL的竞争对手Oracle把InnobaseOy收购了。后来08年Sun公司(开发Java语言的Sun)收购了MySQL AB,09年Sun公司又被Oracle收购了,所以MySQL和 InnoDB又是一家了。有人觉得MySQL越来越像Oracle,其实也是这个原因。
将所有数据存储在RAM中,以便快速访问。这个引擎以前被称为堆引擎。
特点:
把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失;
只适合做临时表。
它的表实际上是带有逗号分隔值的文本文件。csv表允许以CSV格式导入或转储数据, 以便与读写相同格式的脚本和应用程序交换数据。因为CSV表没有索引,所以通常在正常操作期间将数据保存在InnoDB表中,只在导入或导出阶段使用csv表。
特点:
不允许空行,不支持索引;
格式通用,可以直接编辑,适合在不同数据库之间导入导出。
专用与存档,空间经过压缩,用于存储和检索大量很少引用的信息。
特点:
不支持索引;
不支持update、delete。
如果对数据一致性要求比较高,需要事务支持,可以选择InnoDB。
如果数据查询多更新少,对查询性能要求比较高,可以选择MyISAM。
如果需要一个用于查询的临时表,可以选择Memory。
如果所有的存储引擎都不能满足你的需求,并且技术能力足够,可以根据官网内部手册用C语言开发一个存储引擎:https://dev.mvsql.com/doc/internals/en/custom-engine.html
到此这篇关于SQL开发知识:SQL开发知识:SQL开发知识:MySQL中一条SQL查询语句是如何执行的文章就介绍到这了,更多相关MySQL SQL查询语句执行内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
发表评论