通过本文,我们将了解到以下几个问题。
一、思考
问题一:一条SQL语句在MYSQL中是如何执行的?
问题二:MYSQL是如何做到同时处理多个请求的?
二、分析
备注:本文主要参考《极客时间:MySql实战45讲》
-
MySQL执行流程图
-
各模块作用
1.连接器
- 客户端连接MySql服务器命令
mysql -h(IP地址) -P(端口号) -u(用户名)-p
- 连接器的作用
1.负责与客户端建立TCP连接。
2.连接建立之后,验证用户名密码。
3.查询权限表,验证权限(当连接建立之后,即使使用管理员账号修改了此账号密码,依然不影响此连接内的操作,除非重新再次建立连接)。
- 空闲连接
建立连接之后,如果没有后续操作,则该连接处于空闲状态。通过SHOW PROCESSLIST命令可以查看空闲连接(Command:Sleep):
如果客户端太长时间没有动作,则连接器将会断开此连接。可通过以下命令查看默认等待时间(8小时):
- 短连接
每次执行完很少几次查询就断开连接,下次查询重新建立一个连接。建立连接的过程比较复杂,建议使用长连接。
- 长连接
如果客户端持续请求,则一直使用同一个连接。当使用大量长连接时会使MYSQL内存增长特别快。可以通过定期断开长连接或者msyql_reset_connection命令重新创建连接。
2.查询缓存
- 缓存存储形式
key:SQL语句 value:结果,如果缓存命中返回,否则执行后续流程。
- 缓存参数
1.通过参数“query_chae_type”,控制是否开启缓存
2.在SQL语句中控制是否使用缓存
SELECT SQL_CACHE * FROM t WHERE id='1';
对于经常动态更新的表查询缓存的效率会变的非常低,而对于不需要变动的静态表可以使用缓存。
在MYSQL8.0之后已经彻底移除缓存,如果需要缓存可以使用Redis。
3.分析器
- 词法分析
提取Mysql关键词,判断是增删查改的哪一种。
- 语法分析
判断SQL语句是否符合Mysql语法规则。
4.优化器
优化器作用:
1.当表中有多个索引时,选择使用哪一个索引。
2.多表关联查询时,决定各个表的连接顺序。
5.执行器
1.判断对表T是否有执行权限。
2.如果有权限,打开表。根据表的存储引擎定义去调用对应存储引擎的接口。
三、回答开篇
问题一:一条SQL语句在MYSQL中是如何执行的?
通过上文分析,我们已经了解到了MYSQL的基本执行流程,并分析了各个部分的作用。
问题二:MYSQL是如何做到同时处理多个请求的?
MYSQL连接管理器是多线程处理模式,每一个连接请求过来会创建一个线程进行处理。当然可以通过参数设置线程缓存数量(默认为0),这样一个新的请求会判断线程缓存中是否有可用线程,这样可以避免大量的线程创建和销毁带来的开销。具体请看:https://zhuanlan.zhihu.com/p/43941022