版权声明:Za七杂⑧ https://blog.csdn.net/weixin_35085773/article/details/86500142
前面的章节介绍了如何设计最优的库表结构、如何建立最好的索引,这些对于高性能来说是必不可少的。但是还是需要合理的设计查询,如果查询写得糟糕,再合理、索引再合适也无法实现高性能。
6.1 为什么查询速度回满
才查询的时候,不同的地方花费时间包括网络、CPU计算、生成统计信息和执行计划、锁等待等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作,cpu操作或者内存不够倒是io操作很长。操作引擎不同,还会产生大量的上下文切换时间以及系统调用。
6.2 慢查询基础:优化数据访问
查询性能低下最基本的原因是访问的数据太多,某些查询可能不可避免地需要筛选大量数据。
6.2.1 是否想数据库请求了不需要的数据
查询不需要的记录
多表关联时返回全部列
总是取出全部列
重复查询相同的数据
6.2.2 Mysql是否在扫描额外的记录
确定只返回需要的数据以后,接下来查询为了返回结果是否扫描了过多的数据。
扫描的行数和返回的行数
扫描的行数和访问类型
6.3 重构查询方式
6.3.1 一个复杂查询还是多个简单查询
6.3.2 切分查询
事务锁表 小事务会更好
6.3.3 分解关联查询
分解关联查询的方式重构查询有以下优势:
扫描二维码关注公众号,回复:
5023384 查看本文章
- 让缓存的效率更高。
- 将查询分解后,单个查询可以减少锁竞争
- 查询本省效率也会提升,用
IN()
代替关联查询,顺序查询比随机更高效。 - 减少冗余记录的查询
- 更进一步,这样做相当于在应用中实现了哈希关联。
6.4 查询执行的基础
6.4.1 MySQL客户端、服务器通信协议
查询状态
对于一个MySQL链接,或者说一个线程,任何时刻都有一个状态。
6.4.2 查询缓存
6.4.3 查询优化处理
这个过程包括多个子阶段:解析SQL\预处理、优化SQL执行计划
先检查语法是否错误、转化成执行计划。
重新定义关联表的顺序、将外链接转化成内连接、使用等价变换规则、优化COUNT()\MIN\MAX
覆盖索引扫描、子查询优化、提前终止查询、等值传播、列表IN()比较。
数据和索引统计信息
MySQL如何执行关联查询
6.4.4 查询执行引擎
6.4.5 返回结果给客户端
6.5 MySQL查询优化器局限性
6.5.1 关联子查询
如何用好关联子查询
6.5.2 UNION的限制
6.5.3 索引合并优化
6.5.4 等值传递
6.5.5 并行执行
无法利用多核并行查询。
6.5.6 哈希关联
6.5.7 松散索引扫描
6.5.8 最大值最小值优化
找b树最左端或者右端
6.5.9 在同一个表上查询和更新
6.6 查询优化器的提示
参数来调节执行计划
6.7 优化特定类型的查询
6.7.1 优化Count()查询
6.7.2 优化关联查询
6.7.3 优化子查询
6.7.4 优化GROUP BY和DISTINCT
6.7.5 优化limit分页
6.7…
这个没有经历,实在是没有共鸣。
6.8 案例学习
6.8.1 使用MySQL构建一个队列表
6.8.2 计算两点之间的距离
6.8.3 使用用户自定义函数
6.9 总结