参考:https://www.phpmianshi.com/?id=171
架构
mysql是一种单进程多线程的架构,mysql server层的核心组件:连接器、查询缓存、分析器、优化器、执行器
一条sql语句是如何执行的
-
客户端发送一条查询给服务器
-
服务器先检查查询缓存,如果命中缓存,则返回缓存结果
-
服务器进行sql解析、预处理、再有优化器生成对应的执行计划
-
mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询
-
返回结果
连接器
作用:建立连接、权限验证
连接完成后,如果我们没有后续动作,则连接处于空闲状态 show processlist 其中的Command列显示为sleep的这几行,表示系统有几个空闲连接
常见错误:
Lost connection to MySql server during query
客户端如果长时间没有动静,连接器就会将它断开,这个时间是由 wait_timeout控制的,默认8小时,需要重连。
尽量减少建立连接的动作,也就是尽量使用长连接
长连接,占用内存飙升?
-
定期断开长连接
-
mysql5.7 提供了mysql_reset_connection 参数重新初始化资源
查询缓存
-
请求在任何字符上的不同(空格、注释)都是不同的缓存
-
包含系统函数、用户自定义变量和函数、一些系统表都不会缓存
从mysql5.7.20开始不建议使用查询缓存,mysql8.0中删除
更详细的介绍参考:https://www.phpmianshi.com/?id=156
分析器
sql语句 => 解析 => 解析树 => 预处理器(表、列是否存在,名字别名是否有歧义等)
词法分析:select识别出查询语句
语法分析:是否有语法错误
优化器
优化器的目的:
-
将解析树转化为执行计划
-
找到最好的执行计划
衡量方法:
-
基于成本的查询优化(Cost-Based Optimizer CBO)
-
尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个
依赖:
-
根据优化规则对关系表达式进行转换(多执行计划)
-
统计信息和代价模型(成本计算)
执行引擎
查询权限判断
-
如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证
-
查询也会在优化器之前调用precheck权限验证
-
执行器判断一下我们对这个表T有没有执行查询的权限