开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句;
通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。
可以通过配置文件或者命令开启MySQL慢查询;
查看慢查询相关参数
mysql> show variables like 'slow_query%'; +---------------------+--------------------------------------+ | Variable_name | Value | +---------------------+--------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/ef1f09eb8b52-slow.log | +---------------------+--------------------------------------+ 2 rows in set (0.00 sec)
将 slow_query_log 全局变量设置为“ON”状态
mysql> set global slow_query_log='ON';
设置慢查询日志存放的位置
mysql> set global slow_query_log_file='/var/lib/mysql/slow.log';
查询超过1秒就记录
mysql> set global long_query_time=1;
修改配置文件my.cnf,在[mysqld]下的下方加入
[mysqld] slow_query_log = ON slow_query_log_file = /var/lib/mysql/slow.log long_query_time = 1
重启MySQL服务
service mysqld restart
注意,设置slow_query_log_file时,目录必须存在,并且mysql 有权读写该目录,不然会报错;
mysql> set global slow_query_log_file='/root/slow.log'; ERROR 1231 (42000): Variable 'slow_query_log_file' can't be set to the value of '/root/slow.log' mysql> set global slow_query_log_file='/var/lib/mysql/slow.log'; Query OK, 0 rows affected (0.00 sec)
利用explain
关键字可以模拟优化器执行SQL查询语句,来分析sql慢查询语句
mysql> EXPLAIN SELECT * FROM test_user ORDER BY id LIMIT 0,1000 ; +----+-------------+-----------+-------+---------------+---------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+-------+---------------+---------+---------+------+------+-------+ | 1 | SIMPLE | test_user | index | NULL | PRIMARY | 4 | NULL | 1 | NULL | +----+-------------+-----------+-------+---------------+---------+---------+------+------+-------+ 1 row in set (0.00 sec) table显示这一行的数据是关于哪张表的 type显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL rows显示需要扫描行数 key使用的索引