但是使用 set global slow_query_log='ON' 开启慢查询日志 , 只是对当前数据库有效 , 如果MySQL数据库重启后就会失效 。所以如果要永久生效 , 就要修改配置文件 my.cnf (其他系统变量也是如此) , 如下:
[mysqld]slow_query_log=1
然后重启MySQL就可以让慢查询日志记录开启了,至于日志文件的路径就是上面slow_query_log_file对应的路径 。
设置阈值mysql> show variables like 'long_query_time';+-----------------+-----------+| Variable_name | Value |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set (0.00 sec)
阈值默认为10秒 , 我们可以修改阈值大小 , 比如(当然这还是对当前数据库有效):
mysql> set global long_query_time=0.05;Query OK, 0 rows affected (0.00 sec)
设置long_query_time这个阈值之后 , MySQL数据库会记录运行时间超过该值的所有SQL语句 , 但对于运行时间正好等于 long_query_time 的情况 , 并不会被记录下 。而设置 long_query_time为0来捕获所有的查询
参数log_queries_not_using_indexes另一个和慢查询日志有关的参数是 log_queries_not_using_indexes,
如果运行的SQL语句没有使用索引 , 则MySQL数据库同样会将这条SQL语句记录到慢查询日志文件 。首先确认打开了log_queries_not_using_indexes;
mysql> show variables like 'log_queries_not_using_indexes';+-------------------------------+-------+| Variable_name | Value |+-------------------------------+-------+| log_queries_not_using_indexes | ON |+-------------------------------+-------+1 row in set (0.12 sec)
例子 , 没有用到索引进行查询:
mysql> explain select * from vote_record_memory where vote_id = 323;+----+-------------+--------------------+------+---------------+------+---------+------+--------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+--------------------+------+---------------+------+---------+------+--------+-------------+| 1 | SIMPLE | vote_record_memory | ALL | NULL | NULL | NULL | NULL | 149272 | Using where |+----+-------------+--------------------+------+---------------+------+---------+------+--------+-------------+1 row in set (1.56 sec)
可以看到是进行了全表扫描;然后去log日志文件中查看这条SQL已经被标记为慢SQL , 因为它没有使用索引 。
# Time: 180817 11:42:59# User@Host: root[root] @ [117.136.86.151] Id: 2625# Query_time: 0.016542 Lock_time: 0.000112 Rows_sent: 142 Rows_examined: 149272SET timestamp=1534477379;select * from vote_record_memory where vote_id = 323;
将日志记录放入表中MySQL5.1开始可以将慢查询的日志记录放入一张表中 , 在mysql数据库下 , 名为slow_log
| slow_log | CREATE TABLE `slow_log` ( `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `user_host` mediumtext NOT NULL, `query_time` time NOT NULL, `lock_time` time NOT NULL, `rows_sent` int(11) NOT NULL, `rows_examined` int(11) NOT NULL, `db` varchar(512) NOT NULL, `last_insert_id` int(11) NOT NULL, `insert_id` int(11) NOT NULL, `server_id` int(10) unsigned NOT NULL, `sql_text` mediumtext NOT NULL, `thread_id` bigint(21) unsigned NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log' |
推荐阅读
- 分析2.5万篇博客后,来看看后端程序员每天都在写什么
- 炎炎夏日必备七歀凉饮 清淡养生促健康
- 轻巧简约,超强待机!家装网盘必备~优越者S105A硬盘底座拆机简评
- 程序员当独立开发者开发几个月的作息及收支等总结体会
- 家常土豆饼
- 含完整源代码和开发文档 人工智能图像识别绘本阅读方案
- Redis企业级开发与运维-初识Redis
- 要成为一名成功的开发人员,您应该放弃的22件事
- 聊聊Spring boot2.X开发环境搭建和基本开发
- 冬天吃什么早餐?推荐几款必备的御寒早餐