MySQL作为目前使用最广泛的关系型数据库,相信大多数的计算机相关同学都有使用过的经历。但是在我们使用查询语句去获取数据的时候,MySQL的服务器内部执行了哪些操作来支持我们的查询呢?
本篇文章将揭晓答案。
一、基本架构
这是MySQL的基本架构,查询语句从客户端发过来,依次经过连接器、分析器、优化器、执行器,进入存储引擎,最终获取查询结果集返回
我们首先来看查询缓存关闭时,查询sql的执行链路
1.1 连接器
连接器负责和客户端建立连接、权限验证、安全管理。
1.2 分析器
分析器像是sql的编译器,它会执行词法分析、语法分析等操作。主要进行以下分析:
1) 是否使用了正确的关键字(select、where、order、 limit等)
2)关键字的顺序是否正确
3)目标数据表和列是否存在
我们常见的’You have an error in your SQL syntax’错误,就是分析器判断的结果。
1.3 优化器
一条sql语句的执行可以由不同的执行计划来完成,这些计划之间的成本不同。
优化器会基于统计信息和代价模型,选择一条‘它认为’成本最低的计划。
1.4 执行器
执行器拿到优化器生成的执行计划,去调用存储引擎的API来完成最终的数据获取与返回的工作。
1.5 查询缓存
现在,我们再把查询缓存放进来考虑,查询缓存默认关闭,可通过set query_cache_type = 1或者修改配置文件开启。
查询缓存以(key,value)的形式保存执行过的sql语句与查询结果,若一条查询sql可以在查询缓存中找到,则直接返回其对应的查询结果。
与查询缓存的交互会发生在三个阶段:
1)连接器根据拿到的sql,去看查询缓存中是否有相同的key,若有则直接返回
2)分析器在识别到进来的sql是一条update语句,则会将查询缓存设为失效
3)执行器在执行完查询语句后,会向查询缓存添加一个(key,value)对
查询缓存一般不建议开启,因为执行完一次更新操作后,这个表中的查询缓存都会被清空。因此查询缓存只建议在极少更新的表中开启