在实际工作中使用 mysql 时,执行一条语句需要很长时间返回,们称之为慢查询,一般来说,发生慢查询的原因有几个原因。我是遇到过一次,特意看到这篇文章留存一下。分享给大家。
你的索引设计有问题,可能会导致每次执行语句都是全表扫描,这样很耗费时间;
你的 SQL 语句没有写好,可能会导致查询时间变长;
MySQL 选择了错误的索引,同样会导致全表扫描。
数据库引擎选择错误。
通常情况下,在业务上线之前,会在测试环境里面,把 MySQL 的慢查询打开,也就是把 longquerytime 设置为 0,这样确保每一条语句都被记录到慢日志中去,具体的配置可以参考下文。
MySQL 的慢查询日志是MySQL提供的一种日志记录,它是用来记录在MySQL中响应时间超过阀值的语句。系统默认情况下,MySQL 并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。
慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。
默认情况下slowquerylog的值为OFF,表示慢查询日志是禁用的,可以通过设置slowquerylog的值来开启,如下所示:
MYSQL开启慢查询日志:
使用set global slowquerylog=1开启了慢查询日志只对当前数据库生效,如果MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)默认情况下longquerytime的值为10秒,在MySQL源码里是判断大于longquerytime,而非大于等于。从MySQL 5.1开始,longquerytime开始以微秒记录SQL语句运行时间,之前仅用秒为单位记录。如果记录到表里面,只会记录整数部分,不会记录微秒部分。
slowquerylog 慢查询开启状态;
slowquerylog_file 慢查询日志存放的位置;
longquerytime 查询超过多少秒才记录。