查看: 1733|回复: 0

[Mysql数据库] MySQL管理长时间运行查询

发表于 2018-4-4 08:00:02

1. 出现长时间执行的查询的原因

由于SQL执行效率差而导致的长时间查询:

由于被SQL注入而导致的长时间查询:

由于DDL语句引起表元数据锁等待:


2. 长时间执行的查询带来的问题

通常来说,除非是BI/报表类查询,否则长时间执行的查询对于应用缺乏意义。

消耗系统资源,比如大量长时间查询可能会引起 CPU、IOPS 和/或 连接数 使用率过高等问题。

带来系统不稳定的隐患(比如 InnoDB 引擎表上的长时间查询可能会导致 ibdata1 系统文件尺寸的增加)


3. 如何避免长时间执行的查询

应用方面应注意增加防止 SQL 注入的保护。

在新功能模块上线前,进行压力测试,避免出现执行效率很差的 SQL 大量执行的情况。

尽量在业务低峰期进行索引创建删除、表结构修改、表维护和表删除操作。


4. 如何处理长时间执行的查询

a、通过命令 show processlist; 查看当前执行会话,Kill会话长时间查询。

b、创建事件自动清理长时间执行的查询

  1. create event my_long_running_query_monitor
  2. on schedule every 5 minute
  3. starts '2018-08-08 11:00:00'
  4. on completion preserve enable do
  5. begin
  6. declare v_sql varchar(500);
  7. declare no_more_long_running_query integer default 0;
  8. declare c_tid cursor for
  9. select concat ('kill ',id,';') from
  10. information_schema.processlist
  11. where time >= 3600
  12. and user = substring(current_user(),1,instr(current_user(),'@')-1)
  13. and command not in ('sleep')
  14. and state not like ('waiting for table%lock');
  15. declare continue handler for not found
  16. set no_more_long_running_query=1;
  17. open c_tid;
  18. repeat
  19. fetch c_tid into v_sql;
  20. set @v_sql=v_sql;
  21. prepare stmt from @v_sql;
  22. execute stmt;
  23. deallocate prepare stmt;
  24. until no_more_long_running_query end repeat;
  25. close c_tid;
  26. end;
复制代码




回复

使用道具 举报