忍者ブログ

STEP UP BLOG

Home > ブログ > > [PR] Home > ブログ > MySQL > MySQLのSQLプロファイリング

MySQLのSQLプロファイリング

MySQLの実行が遅いときはチューニングが必要です。
MySQLのSQLチューニングですが、基本中の基本がexplainです。
スロークエリログで見つけた遅いSQLをexplainで実行して、適切なインデックスが使用されているか調べるのが、まずはチューニングの第一歩です。
それでも高速化したいSQLのどこが遅いのかわからないときはSQLのプロファイリング情報を調べます。
プロファイリングは以下のようにして表示できます。
mysql> SET PROFILING = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT ...
...
...
117 rows in set (6 min 54.15 sec)

mysql> SHOW PROFILE;
+------------------------------+------------+
| Status                       | Duration   |
+------------------------------+------------+
| starting                     |   0.000246 |
| checking permissions         |   0.000004 |
| checking permissions         |   0.000003 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000002 |
| checking permissions         |   0.000005 |
| Opening tables               |   0.000030 |
| System lock                  |   0.000005 |
| Table lock                   |   0.000094 |
| optimizing                   |   0.000032 |
| statistics                   |   0.000051 |
| preparing                    |   0.000033 |
| Creating tmp table           |   0.000026 |
| executing                    |   0.000003 |
| Copying to tmp table         |   0.161709 |
| Sorting result               |   0.000767 |
| Sending data                 |   0.002630 |
| removing tmp table           |   0.000008 |
| Sending data                 |   0.000007 |
| init                         |   0.000112 |
| optimizing                   |   0.000022 |
| statistics                   |   0.000041 |
| preparing                    |   0.000030 |
| Creating tmp table           |   0.000066 |
| executing                    |   0.000003 |
| Copying to tmp table         |   0.050874 |
| converting HEAP to MyISAM    |   0.033028 |
| Copying to tmp table on disk | 103.846074 |
| Sorting result               | 158.297312 |
| Sending data                 | 151.018799 |
| end                          |   0.000026 |
| removing tmp table           |   0.807298 |
| end                          |   0.000016 |
| query end                    |   0.000004 |
| freeing items                |   0.000045 |
| removing tmp table           |   0.000009 |
| freeing items                |   0.000010 |
| removing tmp table           |   0.000004 |
| freeing items                |   0.000005 |
| removing tmp table           |   0.000006 |
| freeing items                |   0.000033 |
| removing tmp table           |   0.000007 |
| closing tables               |   0.000011 |
| logging slow query           |   0.000002 |
| logging slow query           |   0.000006 |
| cleaning up                  |   0.000007 |
+------------------------------+------------+
50 rows in set (0.00 sec)

上記のように調べたいSQLを実行した後にSHOW PROFILEします。
これはJOINの多いSQLを実行したときですが、めちゃくちゃtmpテーブルを作ってますね。。。
この場合はそもそもJOINがここまで必要とするテーブル構成でいいのか疑問となってきます。
また、"Sorting result"に時間がかかっているのでORDER BYかもしくはGROUP BYがボトルネックとなっていると思われます。
これ以外に手軽にできるチューニングというと、あとはバッファサイズの変更でしょうか。これはサーバスペックなどとにらめっこしながら適正値を探っていかないとなりません。
という感じで、今回はMySQLのSQLプロファイリング情報を調べてボトルネックを突き止めるということをまとめてみました。
PR

Comment0 Comment

Comment Form

  • お名前name
  • タイトルtitle
  • メールアドレスmail address
  • URLurl
  • コメントcomment
  • パスワードpassword

PAGE TOP