数据库基础05-慢查询优化

慢查询

查询任务涉及到:网络,CPU计算,生成统计信息和执行计划,锁等待等操作。这些需要内存操作,CPU操作,内存不足导致I/O操作上消耗时间。

优化数据访问

性能低下的主要原因是访问的数据太多

可能存在的问题:

  • 相同数据重复查询,可以利用缓存技术,减少

  • 查找所有的列

  • 查找不需要的记录

衡量查询开销的三个指标:

  • 响应时间

    • 服务时间:处理查询所需时间

    • 排队时间:等待任务执行的时间

  • 扫描行数

    • 通过EXPLAIN 语句返回的type列返回的访问类型

      • 索引的好处是可以查找更少的行
  • 返回的行数

重构查询的方式

  • 可以将SQL复杂查询切割成多个小查询

  • 将一个查询数据很多条的进行分页,成小的查询

  • 可以将多个关联查询切分成多个简单查询;

    • 单个表查询有缓存,可以利用到查询缓存的结果;

    • 减少了数据库锁竞争

    • 减少重复查询的数据

查询执行的基础

  • 客户端发送查询给服务器,服务器先检查缓存是否命中

  • 如果缓存命中则返回查询结果,如果没有命中,服务器进行SQL解析数据处理,再进行优化器生成执行计划

  • 进行数据查询并进行缓存,返回数据

SQL优化

  • IN,EXISTS和关联子查询

    • 涉及到IN内部子查询,数据库优化器会自动将IN方法里面的查询转成EXISTS查询

    • EXISTS查询时,外层的表查询的type是ALL,所以当外部表很大时,效率会很低;

    • 可以通过INNER JOIN或者LEFT JOIN代替IN()方法的子查询

  • UNION ALL

    • 会创建一个数据查询的临时表
  • 最大值最小值优化

    • MIN(),MAX()查询有的时候不是很好的选择

    • 可以通过order by 和limit 1 联合处理

  • COUNT 统计

    • 不统计列为null的值

    • COUNT(*) 统计行数

  • 关联查询优化

    • ON或USING子句的列上有索引

    • 关联顺序,A/B表关联,关联顺序是A/B,可以不用在A表关联上建索引

  • LIMIT优化

    • 可以将LIMIT查询切换成两部分

      • limit 查询数据的主键

      • 查找这些主键的数据

原文地址:https://www.cnblogs.com/perferect/p/13489540.html