基础架构

MySQL逻辑架构

查询语句执行流程

\"MySQL数据架构图\"
大体来说,MySQL可以分为Server层和存储引擎层两部分。

Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持lnnoDB、MyISAM、Memory等多个存储引擎。执行 create table 建表的时候,如果不指定引擎类型,默认使用的就是lnnoDB。

不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。

连接器

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

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

解决此问题的两种方案:

  1. 定期断开长连接
  2. 执行mysql_reset_connection 来重新初始化连接资源。此过程不需要重连或权限验证。
查询缓存

多数情况不建议使用查询缓存:

  1. 只要对表更新,表上所有查询缓存就会被清空。对于更新压力大的数据库,查询缓存命中率非常低。
  2. 如果是长时间不更新的静态表,才适合用查询缓存,如系统配置表。
  3. 将query_cache_type设置成DEMAND,默认不使用查询缓存。如果使用:
    SELECT SQL_CACHE * from T;
  4. MySQL版本8.0之后没有查询缓存功能了。
分析器

若没有命中查询缓存,此处对SQL语句做解析:

  1. 词法解析:识别字符串;
  2. 语句解析:识别select等关键字、表名、字段名;
  3. 语法分析:语法分析器识别是否符合MySQL语法;
  4. 如果语句有误,会返回\"ERROR 1064 (42000): You have an error in your SQL syntax.\",留意\"use near\"后面的内容。
优化器

优化器是表里有多个索引的时候,决定使用哪个索引;或在一个语句有多表关联(join)的时候,决定各个表的连接顺序。执行方法的逻辑结果一样,但是执行的效率会不同,由优化器决定使用哪一种方案。

执行器

执行语句前,先判断用户对此表是否有执行查询的权限。如没有权限,则返回\" ERROR 1142 (42000): SELECT command denied to user…\"
SELECT * FROM T WHERE Id = 10;执行流程:

  1. 调用InnoDB引擎接口去这个表的第一行,判断ID值是否为10,如果不是则跳过,如果是就将此行存在结果集中;
  2. 调用引擎接口取下一行,重复相同的判断逻辑直到最后一行;
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
收藏 打印