7.查询性能优化
程序员文章站
2024-03-20 13:03:46
...
1.优化数据访问,减少不必要的列(有时为了代码服用可以考虑select *)
2.扫描的行数和访问类型(全表扫描,索引扫描,范围扫描,唯一索引扫描,常数引用)
3.重构查询方式
切分查询(一次1w最佳)
分解关联查询然后在应用中组合(让缓存更高效,减少锁竞争,在应用层做关联可扩展性好,查询效率提升,减少冗余记录查询,相当于在应用层做哈希关联而不是mysql本身的嵌套循环关联)
三种方式应用 where 条件,从好到坏:
1.在索引中使用 where ,这是在存储引擎层实现
2.使用覆盖索引(Using index),直接从索引中过滤不需要的记录,在MySQL服务器层实现,无需回表
3.从数据表返回数据再过滤(Using where),在服务器层实现。
MySQL 查询过程:
客户端=>查询缓存=>解析器=>解析树=>预处理=>解析树=>查询优化器=>执行计划=>执行计划引擎=>api 存储引擎=>数据
mysql 半双工通信
查询状态(每个连接都有一个状态,show full processlist):
1.sleep : 线程正在等待客户端发送新的请求
2.query : 线程正在查询或者返回数据给客户端
3.locked : 在服务器层,等待表锁。在存储引擎实现的锁(行锁)并不会体现
4.analyzing and statistics : 线程正在收集存储引擎统计信息,并生成执行计划
5.copying to tmp table [on disk] : 线程正在查询,并将其结果复制到一个临时表中。这种状态要么在做 group by 操作,要么是文件排序操作,要么是 union 操作。on disk,将一个内存临时表存放到磁盘上。
6.sorting result : 对结果集进行排序
7.sending data : 线程可能在多个状态之间传送数据,或者在生成结果集,或者向客户端发送数据。
优化器:
1.静态优化(编译时优化,只做一次)
2.动态优化(运行时优化,每次执行时需要重新评估)
MySQL 两种排序算法:
1.两次传输排序(旧版本)
2.单次传输排序
关联查询如果需要排序,如果 order by 中的列全部来自第一张表,extra 为 using filesort.
除此之外的所有情况,MySQL会将关联的结果放到临时表中,再进行文件排序。extra 为 using temporary;using filesort
1.查询为什么慢
2.慢查询基础:优化数据访问
3.重构查询方式
4.查询执行的基础
执行计划:
排序优化:
查询执行引擎:
返回结果给客户端:
上一篇: 10.突出显示案例
下一篇: 1. 创建视图vw_count:查询顾客“马云”一共购买了多少部小米Note2,字段分别为客户姓名(cname),商品名字(pname),物品总数量(osum)
推荐阅读
-
7.查询性能优化
-
Memcached深度分析[转] 博客分类: 网站开发及性能优化 memcachedZendPHP应用服务器数据结构
-
记一次500万条数据查询的优化
-
ActiveRecord 查询优化 博客分类: Ruby ActiveRecordRubyOracle应用服务器Rails
-
mysql优化特定类型的查询 博客分类: mysql mysql工作java
-
技术分享 | Semi-join Materialization 子查询优化策略
-
性能优化第一步:Profiler的使用
-
JVM故障诊断与性能优化 博客分类: JVM 内存模型
-
记一次京东Nodejs性能优化,从分析问题到解决问题
-
全网最全的SQL性能优化,助你不再迷茫,步入人生巅峰