为什么查询速度会慢
查询需要经过⽹络、cup计算、磁盘io等操作,这些操作都是
耗时的。
慢查询基础
通常查询了过多的数据导致慢。
a. 检索了太多不必要的数据。
b. 多表连接时,返回全部列。
c. 重复查询数据
衡量查询的三个指标
1. 扫描⾏数
2. 响应时间
3. 返回的⾏数
查询优化的技巧
1. 使⽤索引覆盖
2. 改变库表结构,单独的汇总表
3. 重写查询
重构查询
重构查询的⽅式,等价的替换之前的查询。
查询切分,将⼀个复杂查询切分为多个简单⼦查询,
分解连接查询,将⼀个连接查询分解为多个单表查询,好处
如下:
a. 缓存效率更⾼,单表查询的缓存。
b. 分解为单个查询,减少锁的竞争。
c. 查询效率有所提升,可能⽐连接查询更⾼效。
d. 减少重复查询数据的次数发送⼀个请求MySQL到底做了什么?
a. 客户端发送SQL语句给服务器
b. server端进⾏SQL语句的解析、处理、由优化器⽣成对应的执⾏计划。
c. MySQL根据优化器⽣成的执⾏计划调⽤引擎层的api执⾏查询。
MySQL的客户端服务器通信协议
半双⼯,并不是客户端从服务器获取数据,⽽是服务器推送数据到客户端。
排序优化
排序是成本很⾼的操作,尽量避免排序。数据量⼩在内存中排序,数据量⼤借⽤磁盘排序。
两种排序算法:
a. 两次传输排序,将需要排序的字段进⾏排序,然后读取对应字段的数据。速度慢,需要两次io。
b. 单词传输排序,读取所有的列,然后进⾏排序返回。但占⽤空间⼤。
查询执⾏引擎
执⾏计划是⼀个数据结构,⽽不是可执⾏的字节码。
优化特定类型的查询
优化count(),count(*)统计所有⾏数
优化连接查询
■ 确保on 和using ⼦句列有索引
使⽤with rollup优化group by
优化limit 和 offset
重点在于优化⼤偏移量,⼤偏移量导致扫描了不需要扫
描的⾏数。
使⽤延迟连接
优化SQL CALC FOUND ROWS
作⽤是,⼀些语句在加上limit关键词之后,满⾜limit之
后就抛弃掉以后的数据了,加上该关键词则不会抛弃
limit之后的数据,⽽是继续获取。需要精确的总数可以
使⽤count(*)。
优化union查询
mysql通过填充临时表的⽅式执⾏union查询,如果没有
消除重复⾏的需求,尽量使⽤union all .
只使⽤union MySQL会给临时表加上distinct选项,会
对整个临时表做唯⼀性检查。MySQL总是将结果放⼊临时表。
⼩结
优化三管⻬下:少做、不做、快速的做