• # 01 | 基础架构:一条SQL查询语句是如何执行的?


    下面我给出的是 MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。

    img

    从图中可以看出,不同的存储引擎公用一个server层。

    连接器

    • 连接命令

      mysql -h$ip -P$port -u$user -p

    • 连接保持时间

      • 连接完成之后,如果没有后续的动作,这个连接就会处于空闲状态,可以在show processlist命令中看到。

      • 客户端如果太长时间没有动静,连接器会主动将其断连。这个参数是wait_timeout控制的,默认时间是8小时。

      • 断开之后再发送请求的话,就会收到一个错误提醒:Lost connection to MySQL server during query。需要客户端重新连接,然后再发送请求。

    • 长连接占用内存问题

      • 在执行过程中,连接中使用的内存是管理在连接对象里面的。这些资源只有在断连的时候才会释放。这些长连接累积下来,可能会导致内存占用越来越大,最终被系统OOM掉。
      • 解决:
        • 定期断开连接。使用一段时间以后,或者在程序里面判断执行过一个比较大的操作之后,重新连接。
        • 或者可以在执行过一个较大的操作之后,执行mysql_reset_connection来重新初始化连接资源。

    查询缓存

    建立连接之后,进行select语句查询,就会进入查询缓存阶段。每次的查询会把结果放入缓存,下次有相同的查询会直接在缓存中获取即可,无需进入存储引擎进行查询。

    但是,查询缓存这个事情是弊大于利的,所以不会建议使用。mysql8.0之后直接将该模块删除了。

    为啥有弊呢?因为每次存在update操作的情况下,就会把整个缓存都清除掉,导致缓存命中率特别低。

    在8.0之前的版本,可以直接将query_cache_type设置为DEMAND,这样的话,查询语句默认不使用缓存。在需要使用查询缓存的地方可以显示调用。mysql> select SQL_CACHE * from T where ID=10;

    分析器

    分析器先做“词法分析”,根据语法规则,判断输入的sql语句是否满足mysql语法规则。

    优化器

    优化器是在表中存在多个索引的情况下,决定用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

    执行器

    MySQL通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。

  • 相关阅读:
    VisualVM 分析full GC问题记录
    HTTPS协议、TLS协议、证书认证过程解析
    java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)
    java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)
    MVC中自带的异步((Ajax.BeginForm)无效
    百度富文本编辑器UEDITOR
    只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionSta
    【知识碎片】CSS 篇
    js 将json字符串转换为json对象的方法解析
    【知识碎片】Asp.Net 篇
  • 原文地址:https://www.cnblogs.com/xxxuwentao/p/10598336.html
Copyright © 2020-2023  润新知