本文是极客时间mysql实战专栏的学习笔记,此文是本专栏第一篇
查询语句执行过程
- MySQL分为server层和存储引擎两部分
- server层:(按执行顺序)
- 连接器:管理连接,权限验证。
- 建立连接后,此连接用户拥有的权限取决于此时读到的权限,权限做了修改,不会影响已经存在连接的权限.
- 连接器断开连接,由wait_timeout参数控制,默认是8小时
- 尽量使用长链接
- 长链接过多,会导致内存占用过高,过大可能会被oom
- 定期断开长链接,是解决内存占用高的一个方案
- 5.7版本或更高版本,可以在执行一个大操作后,执行mysql_reset_connection来重新初始化连接资源,这也是解决内存占用高的一个方案
- 查询缓存:命中则直接返回结果
- 连接建立完,就查询缓存,如执行过,执行结果会以key-value形式保存
- 不在缓存中,就继续下个步骤,执行完,将结果存入缓存中
- 不建议使用查询缓存
- 缓存失效非常频繁,一个表更新,此表上所有查询缓存都会被清空
- 对更新压力大的数据库,缓存命中率非常低
- 静态表适合使用查询缓存
- mysql提供按需使用方式,将参数query_cache_type设置成DEMAND,表示默认不使用缓存,需要使用缓存,用类似select SQL_CACHE * from where id=10指定
- mysql8删除了查询缓存功能
- 分析器:词法分析,语法分析
- 没命中缓存,就对sql做解析
- 先做词法分析,分析出字符串是什么,代表什么
- 再做语法分析,判断语句是否符合语法
- 没命中缓存,就对sql做解析
- 优化器:执行计划生成,索引选择
- 经分析器,已经知道要做什么了,优化器决定使用哪个索引,决定表连接顺序
- 执行器:操作引擎,返回结果
- 通过优化器知道怎么做,执行器就要执行了
- 执行前会验证权限,如命中缓存,会在缓存返回结果时做权限验证
- 连接器:管理连接,权限验证。
- 存储引擎层:
- 插件式
- 负责数据的存储和提取
- server层:(按执行顺序)