Mysql基本架构

82 阅读3分钟

写在前面: 本文内容仅用于记录,大多数内容来自于其他博客。

基本架构

image.png

详细架构图

image.png

Mysql逻辑架构图主要分三层:

  1. 第一层负责连接处理,授权认证,安全等等

每个客户端连接都会在服务器进程中拥有一个线程,服务器维护了一个线程池,因此不需要为每一个新建的连接创建或者销毁线程。 当客户端连接到Mysql服务器时,服务器对其进行认证,通过用户名和密码认证,也可以通过SSL证书进行认证。 一旦客户端连接成功,服务器会继续验证客户端是否具有执行某个特定查询的权限。

2)第二层负责编译并优化SQL

这一层包括查询解析,分析,优化,缓存以及所有的的内置函数。 对于SELECT语句,在解析查询前,服务器会先检查查询缓存,如果能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。 所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图。

3)第三层是存储引擎。

存储引擎负责在MySQL中存储数据、提取数据。 存储引擎通过API与上层进行通信,这些API屏蔽了不同存储引擎之间的差异,使得这些差异对上层查询过程透明。 存储引擎不会去解析SQL,不同存储引擎之间也不会相互通信,而只是简单地响应上层服务器的请求。

Index Condition Pushdown (ICP)

ICP(索引条件下推) 是 MySQL 5.6 引入的一项优化技术,用于提高索引范围扫描的效率。

原理
  • 在使用索引扫描时,MySQL 可以将一部分过滤条件下推到存储引擎层。
  • 存储引擎会在索引扫描阶段尽可能多地过滤数据,从而减少回表次数。
启用/禁用
  • 默认开启,可通过参数 optimizer_switch 控制:

    
    SET optimizer_switch='index_condition_pushdown=off';
    
适用场景
  • 查询条件中既包含索引列,又包含非索引列时。
  • 需要减少回表操作的场景。
示例

users,索引为 user_id_idx (user_id)


SELECT * FROM users WHERE user_id > 100 AND age > 25;

执行过程

  1. user_id > 100 是索引列,可以在索引扫描阶段过滤。
  2. age > 25 不是索引列,若启用 ICP,存储引擎会在扫描索引的同时应用条件 age > 25,减少回表。

未启用 ICP

  • 存储引擎返回满足 user_id > 100 的所有行,服务器层再过滤 age > 25

启用 ICP

  • 存储引擎扫描索引并同时应用 age > 25,大幅减少回表操作。
锁模式
  • 记录锁:  在行相应的索引记录上的锁,锁定一个行记录
  • gap锁:  是在索引记录间歇上的锁,锁定一个区间
  • next-key锁:  是记录锁和在此索引记录之前的gap上的锁的结合,锁定行记录+区间。
  • 意向锁 是为了支持多种粒度锁同时存在;