写在前面: 本文内容仅用于记录,大多数内容来自于其他博客。
基本架构
详细架构图
Mysql逻辑架构图主要分三层:
- 第一层负责连接处理,授权认证,安全等等
每个客户端连接都会在服务器进程中拥有一个线程,服务器维护了一个线程池,因此不需要为每一个新建的连接创建或者销毁线程。 当客户端连接到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;
执行过程:
user_id > 100是索引列,可以在索引扫描阶段过滤。age > 25不是索引列,若启用 ICP,存储引擎会在扫描索引的同时应用条件age > 25,减少回表。
未启用 ICP:
- 存储引擎返回满足
user_id > 100的所有行,服务器层再过滤age > 25。
启用 ICP:
- 存储引擎扫描索引并同时应用
age > 25,大幅减少回表操作。
锁模式
- 记录锁: 在行相应的索引记录上的锁,锁定一个行记录
- gap锁: 是在索引记录间歇上的锁,锁定一个区间
- next-key锁: 是记录锁和在此索引记录之前的gap上的锁的结合,锁定行记录+区间。
- 意向锁 是为了支持多种粒度锁同时存在;