MySQL实战 45讲-第一讲

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

  1. mysql服务端(server)的主要模块包含以下几个部分:
    • 连接器:登录权限校验

    • 分析器:词法分析和语法分析,包括表名字段名是否正确

    • 优化器:根据走什么索引之类的效率来优化

    • 执行器:调用存储引擎层的接口,获取最后的结果。

  2. 存储引擎:提供crud等接口供MySQL server端的执行器调用

alt

  1. 连接器
    每个连接会有默认的最长连接时间,超时会断开。
    连接操作很复杂,尽量减少多次连接,也就是多使用长连接。
    长连接也有缺点,每个连接中使用到的临时内存会被连接所管理,所以长连接未及时关闭会造成OOM,可以采用定时关闭长连接+执行完大内存sql后主动关闭连接。

  2. 关于查询缓存:只有当sql一模一样且不包含某些函数(例如now())的查询才会走缓存,但是缓存的效率极低,一个表更新,整表的缓存都会失效。 所以mysql8.0之后删除了查询缓存。

  3. 分析器:词法分析+语法分析,语法分析包含了对表权限的校验和列名,字段的检查等等。例如查询一个没有权限访问的表的同时输入错误的列名,会报无权限。

  4. 优化器:例如select * from a join b where a.id = x and b.id = y 这条语句,有两种执行情况:

    • 1.筛选 a.id = x的数 join 到b 表,再筛选b中id = y的数。
    • 2.筛选 b.id = y的数 join 到a 表,再帅选a中id = x的数。

    优化器会根据两种情况的效率来选择执行哪一种。

  5. 执行器:,执行器会在执行前判断用户是否有这个表的权限,之所以这里还需要权限校验,是因为不在sql里的表也可能会被sql访问到(例如外键的校验,触发器)。
    例如select * from tableA where a=x and b=y, 如果a和b都没有索引,执行器的执行过程是:

    • 1.调用存储引擎接口,查询第一行是否满足a=x and b=y,如果不是则跳过,是则加入结果集。
      1. 循环读取"下一行",知道最后一行。
      1. 返回结果集。
  • 复习Q:

      1. MySQL的框架有几个组件, 各是什么作用?
      1. Server层和存储引擎层各是什么作用?
      1. you have an error in your SQL syntax 这个保存是在词法分析里还是在语法分析里报错? (词法分析,例如把select拼错)
      1. 对于表的操作权限验证在哪里进行?
      1. 执行器的执行查询语句的流程是什么样的?
全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务