MySQL·的架构分为两层,Server 层和存储引擎层
- server·层负责建立连接、分析和执行SQL,MySQL·,MySQL·大多数的核心功能模块都在在这里实现,下图上半部分都是server·层做的事情,另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等)都在server层实现
- 存储引擎层负责数据的存储和提取,MySQL·5.5版本开始默认使用InnoDB存储引擎,索引由存储引擎实现,不同的存储引擎支持的索引类型也不相同,InnoDB支持的索引类型是B+树
- 连接器
当我们使用MySQL·的时候第一步要进行连接操作,连接的时候一般需要三个参数,这里以Linux终端为例:
# -h指定MySQL服务器的IP,我们自己用的话一般是localhost(这种情况下可以不用这个参数)
# -P 默认是3306也可以自己显示声明
# -u 指定用户名
# -p 指定密码
mysql -h$ip -P$port -u$user -p$pwd
MySQL的传输层使用的是TCP协议,首先按照用户提供的IP+port进行三次握手,完成三次握手后进行用户名和密码的验证,验证完成后连接器获取该用户的权限然后缓存起来,后续该用户的任何操作都会基于这条缓存的权限进行,即使连接过程中管理员修改了这个用户的权限也只能应用于该用户下次连接。
空闲连接处理:不同于http的保活机制,MySQL·中借助wait_timeout
这个参数控制,如果在这个时间内客户端没有新的请求则会中断连接。
MySQL·是连接数量有限制,超过最大连接数的时候别的客户端就连接不了了,我这里是151个用户。
- 查询缓存
MySQL·会缓存查询语句的结果然后下次遇到相同的语句时直接返回结果,这么看这个缓存还是有点用的,但是更新缓存的成本太大了,遇到相同的请求的概率太低了,所以MySQL·8.0后删除了缓存机制。
注意:移除的是server·层的查询缓存而不是InnoDB中的buffer pool
- 解析器
解析器完成词法分析
和语法分析
- 词法分析,会根据输入的字符串识别区关键字出来
- 语法分析,根据词法分析的结果,语法解析器会根据词法规则判断输入的SQL语句似乎否满足MySQL·语法,没问题的话构建SQL语法树。
- 执行器
- 预处理过程,检查 SQL 查询语句中的表或者字段是否存在,将 select * 中的 * 符号,扩展为表上的所有列。
- 优化过程,优化器主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引(可以在查询语句前加上
explain
)。 - 执行过程,经历完优化器后,就确定了执行方案,接下来 MySQL 就真正开始执行语句了,这个工作是由「执行器」完成的。在执行的过程中,执行器就会和存储引擎交互了,交互是以记录为单位的。
查询方式: - 主键索引查询,走索引
- 全表扫描,一条一条比较
索引下推
通常情况下,数据库查询的执行顺序是先使用索引找到满足条件的行,然后再对这些行进行进一步的条件过滤。而索引下推则在这个过程中进行了优化,将部分条件过滤操作下推到索引层级进行执行,通过索引下推能够减少二级索引在查询时的回表操作(MySQL 5.6 推出的查询优化策略)。