在项目开发中,那些开发大佬经常会写出一些SQL语句,一条糟糕的SQL语句可能让你测试的整个程序都非常慢,超过10秒的话,我觉得一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较长的SQL语句找出呢?MySQL给我们提供了一个很好的功能,那就是慢查询!所谓的慢查询就是通过设置来记录超过一定时间的SQL语句!那么如何应用慢查询呢?
1、开启MySQL的慢查询日志功能
默认情况下,MySQL是不会记录超过一定执行时间的SQL语句的。要开启这个功能,我们需要修改MySQL的配置文件,Windows下修改my.ini,如果是linux的话,需要Linux下修改my.cnf文件,在[mysqld]最后增加如下命令:
slow_query_log
long_query_time = 1
2、测试慢查询日志功能
进入MySql控制台,执行如下语句:
mysql> select sleep(3);
+----------+
| sleep(3) |
+----------+
| 0 |
+----------+
1 row in set (3.01 sec)
是不是感觉非常慢,如果慢 说明已经开启了慢查询
3、注意点
a、slow_query_log 这句是开启记录慢查询功能,slow_query_log=0关闭;slow_query_log=1开启(这个1可以不写)
b、long_query_time = 1 这句是记录超过1秒的SQL执行语句
4、如何记录低于1s的慢查询记录呢?
进入MySql控制台,执行如下语句:
mysql>set global long_query_time=0.1 设置记录慢查询超过时间100ms的SQL,记住要重启mysql才能生效!
延伸点:
进入到控制台了,接下来,我们查看下MySQL默认配置中多少秒才算慢查询
mysql> show variables like 'long%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
所以系统默认的慢查询时间上限是10秒
接下来 我们改成1秒
mysql> set long_query_time=1; 注: 我设置了1, 也就是执行时间超过1秒的都算慢查询。
Query OK, 0 rows affected (0.00 sec)
判断MySQL开启慢查询日志记录没有?
mysql> show variables like 'slow%';
+------------------------------------+-------------------------------+| Variable_name | Value |
+------------------------------------+-------------------------------+
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_always_write_time | 10.000000 |
| slow_query_log_file | /mysql/carry-slow.log |
| slow_query_log_timestamp_always | OFF |
| slow_query_log_timestamp_precision | second |
| slow_query_log_use_global_control | |
+------------------------------------+-------------------------------+
7 rows in set (0.00 sec)
从slow_query_log 可以知道开关是关闭状态的,
slow_query_log 是否打开日志记录
slow_query_log_file 日志存放位置
MySQL默认没有开启慢查询,下面我们来开启下:
mysql> set global slow_query_log='ON';
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation
mysql>
看来是没权限了啊,于是我去找老大申请了权限
然后再次执行
mysql> set global slow_query_log='ON';
Query OK, 0 rows affected (0.00 sec)
ok了,打完收工!