MySQL体系结构
-
Client Connectors
- JDBC,ODBC,.NET,PHP,Python,PECL,C API
-
MySQL SERVER
-
Connection Pool 连接池
-
SQL Interface SQL接口
-
Parser Lexical 语法解析树
-
Optimizer 根据语法解析来进行优化
-
Caches 缓存
-
Services & utilities 备份集群
-
-
Pluggable Storage Engines
-
MyISAM
-
InnoDB
-
MySQL查询优化-查询执行的路径
1 客户端/服务端通信协议
查询缓存,如果有数据返回,否则继续
2 解析器根据解析树解析
预处理器检测正常继续,否则报错(比如要查询的字段不存在)
3 查询优化器
explain查询执行计划(好比以前我们调试接口才能发现问题所在,现在explain找到查询慢的原因,这是我们程序员最需要学习的地方)
4 查询执行引擎
根据上一步的查询优化指导,选择查询引擎进行查询
5 结果
如果开启了缓存,缓存结果后返回,否则直接返回
MySQL查询优化-查询执行的路径详细讲解
1 mysql客户端/服务端通信
-
半双工
-
双向通信,但是无法同时发送接受
- 客户端一旦开始发送消息,另一端要接受完整个消息后才能响应
- 客户端一旦开始接收数据没法停下来发送指令
-
-
对于一个mysql连接,或者说一个线程,时刻都有一个状态来标识这个连接正在做什么
-
查看命令 show full processlist / show processlist
-
Sleep
- 线程正在等待客户端发送数据
-
Query
- 连接线程正在执行查询
-
Locked
- 线程正在等待表锁的释放
-
Sorting result
- 线程正在对结果进行排序
-
Sending data
- 向请求端返回数据
-
可通过kill{id}的方式进行连接的杀掉
-
2 查询缓存
-
工作原理
- 缓存SELECT操作的结果集和SQL语句
- 新的SELECT语句,先去查询缓存,判断是否存在可用的记录集
-
判断标准
- 与缓存的SQL语句,是否完全一样
- 简单认为存储一个key-value结构,key为sql,value为sql的查询结果集
3 查询优化处理
-
解析sql
-
预处理阶段
-
查询优化器
- 优化器的主要作用就是找到最优的执行计划
- 使用等价变化规则
- 优化count、min、max等函数
- 覆盖索引扫描
- 子查询优化
- 提前终止优化
- IN的优化
- ......
- MySQL的查询优化器是基于成本计算的原则,他会尝试各种执行计划,如要数据抽样进行试验(随机的读取一个4K的数据块进行分析)
- or比in好
- a=1 or a=2 or a=3 or a=4 or a=5
- 一个个比对,时间复杂度为O(n)
- a in (1,2,3,4,5)
- 排序,进行二分法比对,时间复杂度为O(log2N)
- a=1 or a=2 or a=3 or a=4 or a=5
- 优化器的主要作用就是找到最优的执行计划
4 调用执行引擎
5 返回客户端
todo
这节视频课程explain和慢查询日志配置讲的非常好,以后单独写一片博客