数据库慢查询简谈

Posted Java精选集萃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库慢查询简谈相关的知识,希望对你有一定的参考价值。

何为慢SQL

在特定业务环境和技术条件下,我们设定一个阈值,称之为:long_query_time,对于每条dml语句的执行进行耗时统计t,如果t>=long_query_time,则称这条dml语句为慢语句(慢sql)。


mysql中,提供了对慢查询的语句的检测与记录能力。

MySQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中(日志可以写入文件或者数据库表,如果对性能要求高的话,建议写文件)。默认情况下,MySQL数据库是不开启慢查询日志的,long_query_time的默认值为10(即10秒,通常设置为1秒),即运行10秒以上的语句是慢查询语句。


# ON为开启慢查询日志,OFF则为关闭慢查询日志

slow_query_log 


# 指定了慢查询的阈值,即如果执行语句的时间超过该阈值则为慢查询语句,默认值为10秒

long_query_time


# 记录的慢查询日志到文件中(注意:默认名为主机名.log,慢查询日志是否写入指定文件中,需要指定慢查询的输出日志格式为文件,相关命令为:show variables like ‘%log_output%’;去查看输出的格式)

slow_query_log_file


# 这个参数设置为ON,可以捕获到所有未使用索引的SQL语句(注意:如果只是将log_queries_not_using_indexes设置为ON,而将slow_query_log设置为OFF,此时该设置也不会生效,即该设置生效的前提是slow_query_log的值设置为ON)

log_queries_not_using_indexes


慢查询后果

影响层面

可能影响内容

技术

数据库连接池被占满、导致大事务、主从延迟增大

业务

时效变慢、成功率降低、其他关联业务雪崩

用户

体验下降、忠诚度不高的用户流失

系统

数据库被hung死,甚至雪崩,拖垮服务


避免慢查询

sql方向:优化sql语句的编写,严格避免慢查询(不是尽量避免)

  • 考虑在选择性较好的where条件字段添加索引;

  • 避免不必要的排序,如果必要,可以考虑通过在排序字段添加索引减小排序成本。

  • 如果有复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。

  • 不要对 where 条件字段进行函数、算术运算或其他表达式运算,否则可能导致无法正确使用索引。    

  • like条件首位模糊匹配会无法使用索引,例如select id from t where name like '%abc%' 。

  • 从逻辑上降低数据扫描量,考虑sql返回的数据是否都是必要的。比如判断是否存在符合条件的记录,使用limit 1代替count。


监控方向:对慢查询进行监控,及时发现,提早预防

  • 慢查询条数告警

  • 慢查询时间、慢sql记录

  • 定期对慢sql记录进行查询分析、总结




以上是关于数据库慢查询简谈的主要内容,如果未能解决你的问题,请参考以下文章

Git 原理简谈

简谈-如何使用Python和R组合完成任务

简谈性能测试

java中的基本数据类型简谈

简谈JSON

简谈-Python的输入输出运算符数据类型转换