暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

看看mysql的慢查询

测试备忘录 2021-05-31
367

1. 慢查询日志

     MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

2. 慢查询造成的影响

    慢查询造成的影响包括但不限于以下几点:

  • 增加接口的响应时长.从而间接增加整体服务的平均响应时长,进一步影响整个集群的可用性.

  • 大量慢查询会导致数据库的session长期被占用.造成共同使用的其他服务或者接口连接数据库失败.

  • 增加mysql的CPU和内存的使用率,导致mysql的服务可用性下降.

  • 服务接口的整体耗时增长间接导致服务的整体可用性下降(5xx错误和超时).

  • 带宽长期占用,导致影响到其他服务.

3. 数据库慢查询出现的一般情况

  • 大批量的更新数据

  • 我们去更新一个表里面的所有行的某个字段,这种操作不应该出现在接口层面.因为这样的操作对数据库来说时间复杂度为O(N),N为数据行数.

  • 不恰当的汇总数据

    去根据一些条件进行数据汇总,如果这样的情况不可避免,那么也应该合理去设计缓存.避免直接去操作数据库.同样是O(N).

  • 大量数据操作

    一次性取非常多的数据量,会导致IO问题,比如我们一次从数据库获取1000条数据,每条数据2K,那么这样的请求一个请求就会占用10002k = 2M的 带宽,这样的操作如果有1000QPS ,那么一秒中的带宽占用就是 10002M = 2G,这样的带宽占用对于一个服务器来说是致命的. 解决办法就是合理的设计接口和服务,该分页分页,只取需要的字段.不要动不动就select * .

  • 耗时较长的事务操作

    当我们开启一个事务的过程中,会导致数据库给事务涉及的数据上锁,所有其他需求该行数据的请求都会受到影响, 所以耗时较长的事务,应该考虑是否能够用分布式事务的方式来处理.并且一些情况下 我们需要考虑是否能够不使用事务.

  • 联表查询

    联合查询在一些情况下也会造成数据库的慢查询,主要是因为在联表查询的过程中,数据库的执行过程往往很难用到索引.可以考虑是否能够通过冗余一些数据来避免联表查询,空间换时间.拆分查询到单独的表上,并使用索引.

  • 非索引查询

    在数据库的交互过程中,索引起到了至关重要的作用,合理的建立数据的索引能够很大程度上的避免造成慢查询.而慢查询出现最多的场景,往往就是没有正确建立索引.

4. 慢查询通常的监控方式

  • mysql的慢查询日志监控

  • 纳入自定义的监控平台进行监控

文章转载自测试备忘录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论