MySQLのshow profileで単一のクエリーの内部処理時間を調査する方法についてです。
スロークエリログの調査などで、実行時間が長いクエリーが特定できていて、そのクエリーの処理時間が長くなる原因を調査する際に有用です。
※目次をクリックすると目次の下部にコンテンツが表示されます。
プロファイルを有効にする
①設定を確認
mysql> show variables like 'profiling'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | profiling | OFF | +---------------+-------+ 1 row in set (0.01 sec)
②設定を有効にする
mysql> set profiling = 1; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show variables like 'profiling'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | profiling | ON | +---------------+-------+ 1 row in set (0.00 sec)
show profileを実行
調査対象のクエリーを実行後、show profilesを実行します。
①show profilesで一覧表示し、調査対象のクエリIDを確認
①show profilesで一覧表示し、調査対象のクエリIDを確認
mysql> show profiles; +----------+------------+---------------------------------+ | Query_ID | Duration | Query | +----------+------------+---------------------------------+ | 1 | 0.00238325 | show variables like 'profiling' | | 2 | 0.00459550 | show variables like 'profiling' | | 3 | 0.00470500 | show variables like 'profiling' | | 4 | 0.00451175 | show variables like 'profiling' | | 5 | 7.80443025 | SELECT a,b,c・・・・・・・ | | 6 | 0.00458150 | show variables like 'profiling' | +----------+------------+---------------------------------+ 6 rows in set, 1 warning (0.00 sec)
②クエリIDを指定し、show profileを実行
mysql> show profile for query 5; +--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | starting | 0.000063 | | Waiting for query cache lock | 0.000012 | | init | 0.000008 | | checking query cache for query | 0.000227 | | checking permissions | 0.000022 | | Opening tables | 0.071630 | | init | 0.000081 | | System lock | 0.000016 | | Waiting for query cache lock | 0.000005 | | System lock | 0.000043 | | optimizing | 0.000025 | | statistics | 0.000038 | | preparing | 0.000026 | | executing | 0.000004 | | Sending data | 7.241093 | | Waiting for query cache lock | 0.000025 | | Sending data | 0.145314 | | Waiting for query cache lock | 0.000016 | | Sending data | 0.345379 | | end | 0.000015 | | query end | 0.000013 | | closing tables | 0.000020 | | freeing items | 0.000019 | | Waiting for query cache lock | 0.000004 | | freeing items | 0.000283 | | Waiting for query cache lock | 0.000009 | | freeing items | 0.000004 | | storing result in query cache | 0.000006 | | cleaning up | 0.000034 | +--------------------------------+----------+ 29 rows in set, 1 warning (0.01 sec)
プロファイル結果をカスタマイズして表示
実行結果をソートしたり、集計して表示する場合は、テーブルに直接アクセスします。プロファイルのデータはINFORMATION_SCHEMA.PROFILINGに保持されています。
1)INFORMATION_SCHEMA.PROFILINGテーブルの定義内容
1)INFORMATION_SCHEMA.PROFILINGテーブルの定義内容
mysql> describe プロファイル結果をカスタマイズして表示; +---------------------+--------------+------+-----+----------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+----------+-------+ | QUERY_ID | int(20) | NO | | 0 | | | SEQ | int(20) | NO | | 0 | | | STATE | varchar(30) | NO | | | | | DURATION | decimal(9,6) | NO | | 0.000000 | | | CPU_USER | decimal(9,6) | YES | | NULL | | | CPU_SYSTEM | decimal(9,6) | YES | | NULL | | | CONTEXT_VOLUNTARY | int(20) | YES | | NULL | | | CONTEXT_INVOLUNTARY | int(20) | YES | | NULL | | | BLOCK_OPS_IN | int(20) | YES | | NULL | | | BLOCK_OPS_OUT | int(20) | YES | | NULL | | | MESSAGES_SENT | int(20) | YES | | NULL | | | MESSAGES_RECEIVED | int(20) | YES | | NULL | | | PAGE_FAULTS_MAJOR | int(20) | YES | | NULL | | | PAGE_FAULTS_MINOR | int(20) | YES | | NULL | | | SWAPS | int(20) | YES | | NULL | | | SOURCE_FUNCTION | varchar(30) | YES | | NULL | | | SOURCE_FILE | varchar(20) | YES | | NULL | | | SOURCE_LINE | int(20) | YES | | NULL | | +---------------------+--------------+------+-----+----------+-------+ 18 rows in set (0.13 sec)
2)DURATIONの降順に結果表示
mysql> SET @query_id = 5; mysql> SELECT STATE, DURATION FROM INFORMATION_SCHEMA.PROFILING -> WHERE QUERY_ID = @query_id ORDER BY DURATION DESC; +--------------------------------+----------+ | STATE | DURATION | +--------------------------------+----------+ | Sending data | 7.241093 | | Sending data | 0.345379 | | Sending data | 0.145314 | | Opening tables | 0.071630 | | freeing items | 0.000283 | | checking query cache for query | 0.000227 | | init | 0.000081 | | starting | 0.000063 | | System lock | 0.000043 | | statistics | 0.000038 | | cleaning up | 0.000034 | | preparing | 0.000026 | | optimizing | 0.000025 | | Waiting for query cache lock | 0.000025 | | checking permissions | 0.000022 | | closing tables | 0.000020 | | freeing items | 0.000019 | | System lock | 0.000016 | | Waiting for query cache lock | 0.000016 | | end | 0.000015 | | query end | 0.000013 | | Waiting for query cache lock | 0.000012 | | Waiting for query cache lock | 0.000009 | | init | 0.000008 | | storing result in query cache | 0.000006 | | Waiting for query cache lock | 0.000005 | | freeing items | 0.000004 | | executing | 0.000004 | | Waiting for query cache lock | 0.000004 | +--------------------------------+----------+ 29 rows in set (0.00 sec)
3)STATE毎にグループ化し、STATEの合計Durationの降順に表示
mysql> SELECT STATE, SUM(DURATION) AS Total FROM INFORMATION_SCHEMA.PROFILING -> WHERE QUERY_ID = @query_id GROUP BY STATE ORDER BY Total DESC; +--------------------------------+----------+ | STATE | Total | +--------------------------------+----------+ | Sending data | 7.731786 | | Opening tables | 0.071630 | | freeing items | 0.000306 | | checking query cache for query | 0.000227 | | init | 0.000089 | | Waiting for query cache lock | 0.000071 | | starting | 0.000063 | | System lock | 0.000059 | | statistics | 0.000038 | | cleaning up | 0.000034 | | preparing | 0.000026 | | optimizing | 0.000025 | | checking permissions | 0.000022 | | closing tables | 0.000020 | | end | 0.000015 | | query end | 0.000013 | | storing result in query cache | 0.000006 | | executing | 0.000004 | +--------------------------------+----------+ 18 rows in set (0.01 sec)