MySQL 实战笔记

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

大体可以分为:

  • Server 层:包含了连接器、查询缓存、分析器、优化器、执行器,跨存储引擎的功能都在这一层实现的,比如存储过程、触发器、视图等。
  • 「存储引擎」层,负责数据的存储和提取,支持 InnoDBMemory 等多个存储引擎。innoDB 最常用。create table 语句时,可以使用 engine=memory 指定使用内存引擎创建表。

总结:

  • 连接、鉴权、计算在 server 层,
  • 读写、存取数据在引擎层;

连接器

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

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

show processlist 可以查看状态。

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

建立连接比较复杂,建议使用中尽量减少连接的动作,尽量使用长连接。但是全部使用长连接之后,MySQL 占用内存涨的特别快,这是因为 MySQL 在执行过程中,临时使用的内存是管理在连接对象里的。这些资源在连接断开时才释放。可能或导致内存赵勇太大,被系统强行杀掉OOM,从现象看,就是 MySQL 异常重启。

可以考虑两种方案:

  1. 定期断开长连接。
  2. 如果使用的是 MySQL 5.7 或更新的版本,可以在每次执行一个比较大的操作之后,执行 mysql_reset_connection 来重新初始化连接资源。

查询缓存

拿到一个查询请求后,想到查询缓存查看,之前是不是执行过这条语句。查询缓存,弊大于利,只要有对表的更新,这个表的查询缓存就会被清空。更新压力大。除非你的业务表就是有一张静态表。MySQL 8.0 直接将查询缓存模块删除了。

分析器

对 SQL 语句做解析。

  • 先做「词法分析」,识别出各个字符串分别是什么。
  • 接着做「语法分析」,判断是否满足 MySQL 语法。

优化器

  • 在表里有多个索引时,决定使用哪个索引;
  • 一个语句有多表关联join时,决定各表的链接顺序;

优化器阶段完成后,语句的执行方案就确定了。

执行器

  • 开始执行时,先判断对表是否有权限;
  • 获取锁,打开表,根据表的引擎定义,使用引擎提供的接口:
    • 使用 InnoDB 引擎接口取第一行数据,在 server 层执行判断逻辑,满足条件,存到结果集中;
    • 调用引擎接口,取下一行,重复上面的判断逻辑,直到表的最后一行
    • 将满足条件的行组成集作为结果返回给客户端

FAQ

  • 如果表 T 中没有字段 K,执行 select * from where k=1,报错,这个错误是在分析器阶段报出来的。
  • wait_timeout 是客户端非交互式的链接时间,交互连接、关联时间参数为 interactive_timeout,这两个时间参数要尽量一致。可以设置分钟级别。
  • wait_timeout 指的是「连接完成后,使用过程中」的等待时间,connection_timeout 指的是「连接过程中」的等待时间。
原文地址:https://www.cnblogs.com/michael-xiang/p/10545152.html