【MYSQL】スロークエリのログを設定して遅いクエリを記録する

この記事は最新更新日から、6年以上経過しています。

目的

なんかスロークエリのログ出してって言われたのですぐ忘れるからやったこと書きます…。
(私の周りには優秀な人しかいないのでこうなる)

スロークエリログはMYSQLに投げられたSQL(クエリ)で遅いSQLを保存しておいてくれる仕組みです。
あとあと速度が問題になった時にログを見れば問題のSQLが特定しやすくて改善しやすいわけですね。

検証環境

mysql Ver 14.14 Distrib 5.6.37, for Linux (x86_64) using EditLine wrapper
CentOS release 6.9 (Final)

コード

やる気がないのでrootになってルートディレクトリからmysqlの設定ファイルを検索します。
(全ファイル検索しているわけです…、同名のファイルがあっりしたら終わりだ)

find / -name 'my.cnf'
/etc/my.cnf

直接編集するのは怖いので、なにかあったときに戻せるようにコピーしておきます
それからviエディタで編集します

cp /etc/my.cnf /etc/my.cnf.org
vi /etc/my.cnf

[mysqld]の下に下記のようにslow_query_log=ONから追加します
(なんらかの事情があって同じ文章があったら片方コメントつけるなりしましょう)

[mysqld]
slow_query_log=ON
long_query_time=0.5
slow_query_log_file=/var/lib/mysql/slow_query.log
log-queries-not-using-indexes
max_allowed_packet=32M

書き終わったら保存

設定の意味は下記のとおりです
slow_query_log=ON
 →遅いクエリを保存して
long_query_time=0.5
 →0.5秒以下なら保存して
slow_query_log_file=/var/lib/mysql/slow_query.log
 →この場所にログを書き出して、別にログの場所とか名前変えたくなければかかなくて大丈夫
log-queries-not-using-indexes
 →indexついてないクエリも書き出して(indexついてないのは早くても記録されるのでお好みで)

以下は直接スロークエリに関係ないので設定しなくてもいいです
max_allowed_packet=16M →一回のSQLで投げられるデータ量(パケット)の最大値を変更(初期値1Mなので変更)

mysqlを再起動します

service mysqld restart

mysqlにログイン

mysql -u ユーザー名 -p

スロークエリの設定確認(ログ位置も表示される)

> show variables like 'slow%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| slow_launch_time    | 2                              |
| slow_query_log      | ON                             |
| slow_query_log_file | /var/lib/mysql/slow_query.log  |
+---------------------+--------------------------------+

ついでに変更したmax_allowed_packetも確認

> SHOW VARIABLES LIKE 'max_allowed_packet';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| max_allowed_packet | 524288000 |
+--------------------+-----------+
1 row in set (0.02 sec)

exit叩いてmysqlから出ます

> exit
Bye

記録されてるクエリを見てみる

cat /var/tmp/slow_query.log

実行例

テキストにはこういう形で記録されます

# Time: 180427  4:07:24
# User@Host: root[root] @ localhost []  Id:    23
# Query_time: 0.000774  Lock_time: 0.000090 Rows_sent: 0  Rows_examined: 475
SET timestamp=1524802044;
select * FROM table1 WHERE column = 'values'  AND deleted = 0;

まとめ

my.cnfに設定書いて再起動するだけでいいのか…