1. MySql的客户端、服务端架构
- MySQL是一个C/S架构。客户端需要输入账号密码才能登录MySQL服务器,本地也是如此,客户将请求发送给服务端后,服务端根据请求的内容来操作具体的数据,并将结果发送给客户端。
2. bin目录下的可执行文件
可执行文件 | 作用 |
---|---|
mysqld | mysql服务程序,运行这个文件可运行MySQL服务进程 |
mysqld_safe | 启动脚本,执行这个文件会间接调用mysqld并持续监控服务器的运行状态。当服务器进程出现错误是,可以帮助重启服务器进程,可以将错误输出到错误日志中去 |
mysqld.server | 间接调用mysqld_safe,输入mysql.server start 就可以启动服务进程。其实mysql.safe是一个连接文件,实际文件是../support-files/mysql.server |
mysqld_multi | 可以运行多个服务器实例,也就是说可以运行多个MySQL服务器 |
- MySQL的两种启动方式
- 手动启动:点击mysqld,或直接双击。
- 以服务方式启动:如果需要将某个程序长时间运行在计算机上,可以将其注册为一个windows服务。
完整可执行文件的路径 --install [-manual] [服务名]
,例如C:\Program Files\MySql\MySql Server 8.0\bin\mysqld
,将MySQL注册为windows服务,通过net start MySql 和 net stop MySql
来启动和开启MySQL。
3. 客户端和服务器的连接过程
MySQL支持几种客户端进程和服务端进程通信的方式。
- TCP/IP:通过网络协议IP加端口号进行通信。MySQL默认监听3306端口
- 命名管道和内存共享(客户端和服务端必须在同一台计算机上,并不常用)
- 使用管道通信:在启动服务器程序的命令中加上
--enable-named-pipe
参数,然后在启动客户端程序的命令中加上-pipe或者--protocol=pipe
- 使用共享内存进行通信:在启动服务器程序的命令中加上
--shared-memory
参数,成功后,共享内存成为本地客户端程序的默认连接方式。
- 使用管道通信:在启动服务器程序的命令中加上
- UNIX域套接字
4. 服务器处理客户端请求
4.1 连接管理
- 每当有一个客户端连接到服务器时,服务进程都会创建一个线程来处理两者之间的交互,当客户端退出时会与服务端断开连接,但不会立即销毁这个进程,而是将其缓存起来,当有新的客户端需要连接时,服务端将缓存的进程资源分配给新的客户端,这样就不用频繁地创建和销毁进程,当然也可以限制连接到服务器的的客户数量。
- 可以采用传输层安全性(TLS)协议对连接进行加密,将客户端输入的密码等信息传送给服务端,从而保证数据传输的安全性。
4.2 解析和优化
服务端将客户端发送的文本信息(SQL语句等)进行解析优化
- 查询缓存
服务端会将处理过的查询请求和结果缓存起来,如果下次有同样的请求发送,会从缓存中查找结果,就不用从底层的表中查找了。返回缓存中的结果比较苛刻,要求两次查询请求要完全相同(包括大小写、空格等),有些函数的结果并不会被缓存,比如NOW()函数返回的是当前时间就不会被缓存。
MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。
维护缓存的开销比较高,从5.7.20开始不推荐查询缓存,8.0中直接将其删除 - 语法解析
将请求文本进行分析,判断语法是否有问题,然后从文本中将要查询的表、各种查询条件提取到服务器中。
- 查询优化
优化语句,比如将外连接转化成内连接、表达式简化、子查询转为连接,将结果生成一个执行计划
- 存储引擎
存储引擎将数据存储在内存中,如何记录,如果读取都是存储引擎需要做的事情,不同的引擎可能有这不同的存储结构,采用存储算法不同。表实际是一个逻辑上的概念,其中的数据散列地有规律地分布在不同的数据结构中。
- 人们将MySQL的请求处理过程分为server层和存储引擎层。连接管理、查询优化等都是server层,存储引擎层是真实存放数据的,存储引擎为server层提供统一的接口,server层和存储引擎层是以记录为单位。server层判断某记录符合条件(如where语句)之后,先将其发送到缓冲区,当缓冲区满了,才向客户端返回真正的记录。
常用的存储引擎
存储引擎 | 描述 |
---|---|
InnoDB | 常用,支持事务、行级锁、外键 |
MyIsAM | 常用,主要的非事务处理引擎 |
NDB | MySQL集群专用存储引擎 |
CSV | 存储数据时,以逗号分隔各个数据项 |
MEMORY | 只存储在内存,不存储在磁盘,多用户临时表 |
修改引擎:ALTER TABLE 表名 ENGINE = 存储引擎名称