MySQL之基础架构

606 阅读6分钟

MySQL架构.drawio.png

第一层 服务层

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

1.连接器

  • 建立连接

    连接器负责跟客户端建立连接、获取权限、维护和管理连接。建立连接的命令一般为:

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

    每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程。(MySQL5.5+支持线程池(Thread-Pooling)插件,可以使用池中少量的线程来服务大量的连接)。

    服务器需要对客户端认证基于用户名、原始主机信息和密码。连接过程经过TCP三次握手、安全套接字连接。一旦连接成功,连接器会到权限表里查出相应的权限。也就是说,一个连接建立完成后,对这个用户的权限做出修改并不会影响该连接,只有重新建立的连接才会使用新的权限

  • 管理连接

  • 空闲连接:如果连接建立后,没有后续动作,连接处于空闲状态。
    

    查看空闲连接的命令:

    show processlist

    Command中显示为sleep的即为空闲连接。连接器维持一个空闲连接的时间由参数wait_timeout控制。

  • 长连接:连接成功后,客户端持续的请求一直用同一个连接。
    

    为了节约建立连接的开销,尽量使用长连接。但是全部使用长连接会有什么影响呢?MySQL在执行过程中临时使用的内存是管理在连接里的,这些资源在连接断开时才释放。也就是说,长连接可能会导致内存占用过大。 现象表现为MySQL异常重启。

    解决这个问题有以下两种方案: 1、定期断开长连接(使用一段时间或执行完一个占用内存较大的连接后断开连接);2、MySQL5.7+可在每次执行完占用大内存的操作后,执行mysql_reset_connection来初始化资源。该过程不需要重连和重新校验权限。

  • 短连接:每次执行完很少的请求就断开连接,下次查询再重新建立连接
    

2.查询缓存

如果查询语句在查询缓存中命中,直接返回查询结果。否则继续执行后面的流程。执行完成后,执行结果存进查询缓存中。是否开启查询缓存的参数为query_cache_type,设置为DEMAND表示默认的语句不使用查询缓存,对于确定要使用查询缓存的语句,用SQL_CACHE显示指定。

  • 优点:缓存命中直接返回,无需执行后面的流程
  • 缺点:维护查询缓存的代价很高。只要有对一个表的更新,这个表上的所有缓存都清空。也就是说,查询缓存适用于静态表。

MySQL8.0以后将查询缓存的整块功能删除。

3.分析器

  • 词法分析:识别出字符串分别代表什么
  • 语法分析:根据词法分析的结果,判断SQL语句是否满足MySQL语法

4.优化器

MySQL会解析查询,创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序、选择合适的索引等。可通过特殊的关键字提示(hint)优化器,也可以请求优化器解析(explain)优化过程的各个因素。

explain的各个字段:

  • id:标识SQL执行的顺序

  • select_type:查询中每个select子句的类型

  • table:显示这一行的数据是关于哪张表的

  • type:MySQL在表中找到所需行的方式

  • possible_keys:指出MySQL可以使用哪个索引在表中找到记录(查询涉及到的字段上若存在索引,则该索引被列出,但不一定会使用)

  • key:MySQL实际使用的键(索引)

  • key_len:表示索引中使用的字节数

  • ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

  • rows:表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

  • Extra:包含MySQL处理查询的详细信息

    1. Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
      
    2. Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
      
    3. Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”(如果出现以上的两种的红色的Using temporary和Using filesort说明效率低)
      
    4. Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
      
    5. Impossible where:这个值强调了where语句会导致没有符合条件的行。
      
    6. Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行(复合索引再使用时,尽量的考虑查询时,常用的排序方向和字段组合顺序)
      

5.执行器

执行器阶段开始执行语句。在执行开始时会验证该用户的权限,如果有权限,执行器根据这个表的引擎定义去调用这个引擎的接口。

第二层 存储引擎层

存储引擎负责MySQL数据的存储和提取。每个存储引擎都有它的优势和劣势。服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。

存储引擎不会去解析SQL,不同存储引擎之间也不会相互通信,只是简单地响应上层服务器的请求。