一条 SQL 是如何执行的?

一条SQL查询语句是如何执行的?

Server 层

大多数核心服务功能;
所有内置函数;
所有跨存储引擎的功能;
---- 例如存储过程,触发器,视图等;

连接器

    • mysql -h$ip -P$port -u$user -p
  • show processlist 查看连接
  • wait_timeout 参数,控制连接的断开,
    默认8小时无操作自动断开。
  • 连接被断开后,客户端再次发送请求,会收到错误提醒: Lost connection to MYSQL server duing query 。

    • 密码错误将会收到 “Access denied for user” 的错误;
    • 用户名密码认证通过后,连接器会在权限表中查出你拥有的权限,之后,这个连接里面的权限判断逻辑,都会依赖于此时读到的权限。
    • 用户成功连接后,你对该用户的权限做了修改,也不会影响已存在连接的权限。
  • 长连接:连接成功后,如果客户端持续有请求,则一直使用同一个连接;
  • 短连接:每次执行完很少几次查询就断开连接,下次查询再重新建立一个;

    • 建立连接过程复杂,建议尽量使用长连接。
    • 长连接过多时, MYSQL 占用内存大,可能导致异常重启。(执行过程临时使用的内存是管理在连接对象里面的)

      • 解决方案1:定期断开长连接
      • 解决方案2: MYSQL >= 5.7 版本,可以使使用 mysql_reset_connection 重新初始化连接资源;

        • 无需重连
        • 无需重新做权限验证
        • 概要: 将连接恢复到刚创建完成的状态

查询缓存

  • 1.只要对表有更新,缓存就会被清空
  • 2.按需缓存,将参数 query_cache_type 设置成 DEMAN 后,对于需要查询缓存的使用 SQL_CACHE 显式指定:

select SQL_CACHE * from T where ID=1;

    1. MYSQL 8.0 版本将缓存模块功能删除了

分析器

  • 1.词法,语法分析

    • 按关键字分析

      • 1.语法有误将会收到:You have an error in your SQL syntax. 的错误提示;
        1. “use near” 后面的内容是你需要关注的。
  • 2.表名,字段等的分析

优化器

  • 优化 SQL 语句执行顺序等。
  • 索引选择

执行器

  • 1.先判断权限
  • 2.操作引擎,返回结果

存储引擎层

功能:数据存储和提取;
架构:插件式架构;
---- 5.5.5 版本开始,innoDB 为默认存储引擎;
---- 不同存储引擎共用一个 Server 层;

一条SQL更新语句是如何执行的?

重做日志:redo log

  • InnoDB 引擎特有的

    • crash-safe:即使数据库发生异常重启,之前提交的记录都不会丢失;
  • 物理日志,记录的是‘在某个数据页上做了什么修改
  • 循环写,空间固定会用完,会覆盖之前的日志。

归档日志:binlog

  • MYSQL server 层实现,所有引擎都可以使用
  • 逻辑日志,记录的是日志原始逻辑,如:给
    ID=2 的这一行的 c 字段加 1
  • 可以追加写入(文件写到一定大小会切换到下一个,不会覆盖以前日志)

Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。

Redo log不是记录数据页“更新之后的状态”,而是记录这个页 “做了什么改动”。

XMind: ZEN - Trial Version

Xmind 图

Larwas
请先登录后发表评论
  • 最新评论
  • 总共0条评论