MySQLのスロークエリログをONにするコマンドはこれだ
結論としてはこれね。
1 |
mysql> set global slow_query_log = ON; |
上記を実行する前に、まず、今現在の設定を確認しよう。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> show variables like 'slow%'; +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | slow_launch_time | 2 | | slow_query_log | OFF | | slow_query_log_file | /foo/bar/mysqld/mysqld-slow.log | +---------------------+---------------------------------+ 3 rows in set (0.00 sec) mysql> |
私の環境ではデフォルトでOFFだった。
OFFだったらONにせにゃならんけど、my.cnfとかいじりたくないよね。そーゆー人は、これを打とう。my.cnfをいじらずスロークエリログをONにできる。
1 2 |
mysql> set global slow_query_log = ON; Query OK, 0 rows affected (0.00 sec) |
で、コマンドラインから、さっき上記コマンドで確認した slow_query_log_file のファイルパスをcatしよう。
1 |
# cat /foo/bar/mysqld/mysqld-slow.log |
こんな感じに出てくる。
1 2 3 4 5 6 7 8 9 10 |
# cat /var/run/mysqld/mysqld-slow.log /foo/bar/mysqld, Version: 5.x.x (Source distribution). started with: Tcp port: xxxx Unix socket: /foo/bar/mysql/mysql.sock Time Id Command Argument # Time: 170713 19:55:58 # User@Host: user @ 192.168.0.4 [] # Query_time: 1530.645857 Lock_time: 0.003042 Rows_sent: 28 Rows_examined: 34617621 use dbname; SET timestamp=1499943358; select zipcode from t_zipcode where ... |
見方は下記の通り。
1 2 3 4 5 6 7 8 9 10 |
# cat /var/run/mysqld/mysqld-slow.log /foo/bar/mysqld, Version: 5.x.x (Source distribution). started with: Tcp port: xxxx Unix socket: /foo/bar/mysql/mysql.sock Time Id Command Argument # Time: 170713 19:55:58 <- この時刻からSQL実行がスタート # User@Host: user @ 192.168.0.4 [] <- このホストからデータ抽出した # Query_time: 1530.645857 <-SQL実行にかかった時間(秒数) Lock_time: 0.003042 <-テーブルロックされた時間(秒) Rows_sent: 28 <-結果行数 Rows_examined: 34617621 <-読み取り対象になった行数 use dbname; SET timestamp=1499943358; select zipcode from t_zipcode where ... |
そんでそのあと、その遅かったSQL文をexplainしよう。こんな感じに出てくるよ。これの読み方は、下記ブログの記事が最強なので参照のこと。
http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
1 2 3 4 5 6 7 8 9 |
mysql> explain select zipcode from t_zipcode where ... +----+--------------------+------------+-------+----------------------------------+------------------+---------+---------+------+-----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+------------+-------+----------------------------------+------------------+---------+---------+------+-----------------------------------------------------+ | 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables | | 3 | DEPENDENT SUBQUERY | t_zipcode1 | ref | t_zipcode1_idx01 | t_zipcode1_idx01 | 214 | zipcode | 5 | Using where; Using index | | 2 | DERIVED | t_zipcode2 | range | t_zipcode2_idx02,t_zipcode_idx01 | t_zipcode2_idx02 | 8 | NULL | 1 | Using where; Using temporary; Using filesort | +----+--------------------+------------+-------+----------------------------------+------------------+---------+---------+------+-----------------------------------------------------+ |
みんな、がんばって~
私の場合は、indexを張るのをまるっとわすれておりました。あほすぎる。
あ、最後には、必要に応じてスロークエリログをOFFにしてね。
1 |
mysql> set global slow_query_log = OFF; |