第六章 查询性能优化

版权声明:Za七杂⑧ https://blog.csdn.net/weixin_35085773/article/details/86500142

前面的章节介绍了如何设计最优的库表结构、如何建立最好的索引,这些对于高性能来说是必不可少的。但是还是需要合理的设计查询,如果查询写得糟糕,再合理、索引再合适也无法实现高性能。

6.1 为什么查询速度回满

才查询的时候,不同的地方花费时间包括网络、CPU计算、生成统计信息和执行计划、锁等待等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作,cpu操作或者内存不够倒是io操作很长。操作引擎不同,还会产生大量的上下文切换时间以及系统调用。

6.2 慢查询基础:优化数据访问

查询性能低下最基本的原因是访问的数据太多,某些查询可能不可避免地需要筛选大量数据。

6.2.1 是否想数据库请求了不需要的数据

查询不需要的记录
多表关联时返回全部列
总是取出全部列
重复查询相同的数据

6.2.2 Mysql是否在扫描额外的记录

确定只返回需要的数据以后,接下来查询为了返回结果是否扫描了过多的数据。

-w616

扫描的行数和返回的行数
扫描的行数和访问类型

-w647

6.3 重构查询方式

6.3.1 一个复杂查询还是多个简单查询

-w630

6.3.2 切分查询

-w632
事务锁表 小事务会更好

6.3.3 分解关联查询

-w576
分解关联查询的方式重构查询有以下优势:

扫描二维码关注公众号,回复: 5023384 查看本文章
  • 让缓存的效率更高。
  • 将查询分解后,单个查询可以减少锁竞争
  • 查询本省效率也会提升,用IN()代替关联查询,顺序查询比随机更高效。
  • 减少冗余记录的查询
  • 更进一步,这样做相当于在应用中实现了哈希关联。

6.4 查询执行的基础

-w613

6.4.1 MySQL客户端、服务器通信协议

-w600
-w580
查询状态
对于一个MySQL链接,或者说一个线程,任何时刻都有一个状态。
-w627
-w633

6.4.2 查询缓存

-w623

6.4.3 查询优化处理

这个过程包括多个子阶段:解析SQL\预处理、优化SQL执行计划
先检查语法是否错误、转化成执行计划。-w640
重新定义关联表的顺序、将外链接转化成内连接、使用等价变换规则、优化COUNT()\MIN\MAX-w621
覆盖索引扫描、子查询优化、提前终止查询、等值传播、列表IN()比较。
-w657
数据和索引统计信息
MySQL如何执行关联查询
-w602

-w648
-w604

6.4.4 查询执行引擎

-w609

6.4.5 返回结果给客户端

-w607

6.5 MySQL查询优化器局限性

6.5.1 关联子查询

-w615

如何用好关联子查询
-w425

6.5.2 UNION的限制

-w598

6.5.3 索引合并优化

-w607

6.5.4 等值传递

-w603

6.5.5 并行执行

无法利用多核并行查询。

6.5.6 哈希关联

-w580

6.5.7 松散索引扫描

-w615

6.5.8 最大值最小值优化

-w629
找b树最左端或者右端

6.5.9 在同一个表上查询和更新

-w659

6.6 查询优化器的提示

参数来调节执行计划

6.7 优化特定类型的查询

6.7.1 优化Count()查询

-w630

6.7.2 优化关联查询

-w666

6.7.3 优化子查询

-w648

6.7.4 优化GROUP BY和DISTINCT

6.7.5 优化limit分页

6.7…

这个没有经历,实在是没有共鸣。

6.8 案例学习

-w666

6.8.1 使用MySQL构建一个队列表

-w643
-w630
-w618

6.8.2 计算两点之间的距离

-w598

6.8.3 使用用户自定义函数

-w598

6.9 总结

-w604
-w613
-w669

猜你喜欢

转载自blog.csdn.net/weixin_35085773/article/details/86500142