最近阅读MySQL高性能,略有收获,好记忆不如烂笔头,记录一下。本期笔记主要是围绕高性能MySQL第六章查询性能优化。
整体结构
重点、亮点内容摘抄
第六章 查询性能优化
查询优化、索引优化、库表结构优化需要齐头并进,一个不落。在获得编写MySQL查询经验的同时,也将学习到何为高效的查询设计表和索引,也可以学习到优化库表结构时会影响到那些类型的查询。
本章从查询设计的一些基本原则开始,介绍一些查询优化的技巧以及MySQL优化器内部的机制,展示MySQL是如何执行查询的,如何改变一个查询的执行计划。
1. 查询执行的过程
执行路径:
- 客户端发送查询请求
- 服务器检查是否有缓存,未命中缓存则进入下一阶段,命中则直接返回
- 服务器端解析 SQL ,预处理,优化器生成对应的执行计划
a. 解析器进行语法解析
b. 预处理:判断解析树是否合法,验证权限
c. 优化器生成执行计划:优化器基于成本模型做出认为的最优选择
- MySQL 认为的最优跟你想的最优可能不一样,并不一定是时间最短的查询
- 静态优化&动态优化 -> “编译时”优化&“运行时”优化
- 优化器优化类型:
- 重新定义关联表的顺序(驱动表)
- 外连接转为内连接
- 条件的等价转换
- 优化 count()
- 预估并转为常数表达式(关联查询时,根据第一层查询的结果预估第二层查询的类型,转为常数表达式类型)
- 覆盖索引扫描
- 子查询优化
- 提前终止查询(limit)
- 等值传播(连表健做条件时,条件可传播到两个表)
- in 查询 VS