MySQL知识总结

原创于:极客时间 MySQL45讲(丁奇)

第1讲:一条SQL查询语句是如何执行的?

image.png
  • 默认的存储引擎是InnoDB

  • 连接器

    • 连接器负责跟客户端建立连接、获取权限、维持和管理连接。

      mysql -h$ip -P$port -u$user -p
      
    • 连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。

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

    • 客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout控制的,默认值是 8 小时。

    • 数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

    • 建立连接的过程通常是比较复杂的,所以我建议你在使用中要尽量减少建立连接的动作,也就是尽量使用长连接。

    • 但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。

  • 查询缓存

    • 连接建立完成后,你就可以执行 select 语句了。执行逻辑就会来到第二步:查询缓存。
    • 之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value是查询的结果。
    • 只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
  • 分析器

    • 如果没有命中查询缓存,就要开始真正执行语句了。
  • 优化器

    • 优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
  • 执行器

    • 执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。

posted @ 2022-02-12 11:10  蔚蓝的海洋  阅读(43)  评论(0编辑  收藏  举报