欢迎投稿

今日深度:

啥?我写的一条SQL让公司网站瘫痪了...,

啥?我写的一条SQL让公司网站瘫痪了...,


一条慢查询会造成什么后果?之前我一直觉得不就是返回数据会慢一些么,用户体验变差?


图片来自 Pexels

其实远远不止,我经历过几次线上事故,有一次就是由一条 SQL 慢查询导致的。

那次是一条 SQL 查询耗时达到 2-3 秒「没有命中索引,导致全表扫描」,由于是高频查询,并发一起来很快就把 DB 线程池打满了,导致大量查询请求堆积,DB 服务器 CPU 长时间 100%+,大量请求 timeout...

最终系统崩溃,老板登场!可见,团队如果对慢查询不引起足够的重视,风险是很大的。

经过那次事故我们老板就说了:谁的代码再出现类似事故,开发和部门领导一起走人,吓得一大堆领导心发慌,赶紧招了两位 DBA 同事🙂🙂🙂。

慢查询,顾名思义,执行很慢的查询。有多慢?超过 long_query_time 参数设定的时间阈值(默认 10s),就被认为是慢的,是需要优化的。慢查询被记录在慢查询日志里。

慢查询日志默认是不开启的,如果你需要优化 SQL 语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的(想想一个 SQL 要 10s 就可怕)。好了,下面我们就一起来看看怎么处理慢查询。

慢查询配置

开启慢查询

MySQL 支持通过以下方式开启慢查询:

  • 输入命令开启慢查询(临时),在 MySQL 服务重启后会自动关闭。
  • 配置 my.cnf(Windows 是 my.ini)系统文件开启,修改配置文件是持久化开启慢查询的方式。

方式一:通过命令开启慢查询

步骤 1:查询 slow_query_log 查看是否已开启慢查询日志:

  1. show variables like '%slow_query_log%'; 
  1. mysql> show variables like '%slow_query_log%'; 
  2. +---------------------+-----------------------------------+ 
  3. | Variable_name       | Value                             | 
  4. +---------------------+-----------------------------------+ 
  5. | slow_query_log      | OFF                               | 
  6. | slow_query_log_file | /var/lib/mysql/localhost-slow.log | 
  7. +---------------------+-----------------------------------+ 
  8. 2 rows in set (0.01 sec) 

步骤 2:开启慢查询命令:

  1. set global slow_query_log='ON'; 

步骤 3:指定记录慢查询日志 SQL 执行时间得阈值(long_query_time 单位:秒,默认 10 秒)。

如下我设置成了 1 秒,执行时间超过 1 秒的 SQL 将记录到慢查询日志中:

  1. set global long_query_time=1; 

步骤 4:查询 “慢查询日志文件存放位置”。


点赞 0

www.htsjk.Com true http://www.htsjk.com/shujukukf/43343.html NewsArticle 啥?我写的一条SQL让公司网站瘫痪了..., 一条慢查询会造成什么后果?之前我一直觉得不就是返回数据会慢一些么,用户体验变差? 图片来自 Pexels 其实远远不止,我经历过几次线上事故...
评论暂时关闭