MySQL实战之一:一条sql查询语句如何执行

本文是极客时间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做解析
          • 先做词法分析,分析出字符串是什么,代表什么
          • 再做语法分析,判断语句是否符合语法
      • 优化器:执行计划生成,索引选择
        • 经分析器,已经知道要做什么了,优化器决定使用哪个索引,决定表连接顺序
      • 执行器:操作引擎,返回结果
        • 通过优化器知道怎么做,执行器就要执行了
        • 执行前会验证权限,如命中缓存,会在缓存返回结果时做权限验证
    • 存储引擎层:
      • 插件式
      • 负责数据的存储和提取

文章作者: BY 木易杨
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BY 木易杨 !
评论
 上一篇
MySQL实战之二:sql语句执行之日志系统 MySQL实战之二:sql语句执行之日志系统
本文是MySQL实战专栏第二篇,关于mysql日志系统 MySQL日志 slq更新流程会涉及两个重要日志模块 重做日志,redo log 二进制日志 binlog 重做日志 redo log mysql每次更新操作都需要写磁盘,在
2020-04-24 BY 木易杨
下一篇 
时间管理 时间管理
此篇文章是根据国外一片博客的个人总结 时间管理之60-30-10法则 时间管理的本质是分轻重缓急,在合适的时间做合适的事,学会60-30-10法则,可以让你从无序的生活中解脱出来。 将一天中60%时间用于高价值的活动,30%时间给低价值
2020-04-01 BY 木易杨