Day2:MySQL慢查询基础-查询慢原因

说在前面:
查询优化、索引优化、库表结构优化是查询性能优化的三驾马车。

完成一个完整的查询生命周期,查询需要在不同阶段花费时间,如网络、CPU计算、生成统计信息、执行计划、锁互斥等待,底层存储引擎调用,需要在内存操作,CPU操作和内存不足导致I/O操作上时间消耗。

1. 请求多余的数据

查询数据超过实际程序需数据,冗余数据被程序丢弃。这会对MYSQL服务器带来额外的负担,增大网络开销,同时会消耗应用服务器的CPU 及内存资源。

  • 查询不需要记录

LIMIT 解决查询无用的数据

  • 多表关联返回全部列

仅获取需要的列

  • 取出全部列

错误示例:SELECT * FORM … …
如有缓存或提高代码复用性,上面示例也可考虑

  • 重复查询相同数据

2. 扫描额外的记录

衡量查询最简单三个指标:响应时间、扫面行数、返回行数。

  • 响应时间

响应时间即:服务时间(指数据库处理这个查询真正花费的时间)和排队时间(服务器等待某些资源而没有真正执行查询的时间–可能是等I/O操作完成,或等待行锁等等)。

  • 扫面的行数和返回行数
  • 扫面的行数和访问类型

EXPLAIN访问类型:全表扫面到索引扫面、范围扫描、唯一索引扫描、常数引用等。以上列举是速度从慢到快,扫描行数从多到少。
查询中无合适访问类型,最好办法是增加一个合适的索引。

WHERE条件拓扑

  • 索引使用WHERE,是在存储引擎层完成。
  • 索引覆盖扫描(Extra:Using where),直接从索引中过滤记录,是在MYSQL服务层完成,但无需查询表记录。
  • 数据表返回结果,服务层完成。MySQL需先从数据表读取记录然后过滤。
    原文作者:蚂蚁窝大梦想
    原文地址: https://www.jianshu.com/p/c7790725f242
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞