実行中のSQL文の稼働確認
スロークエリログは実行が完了した時点で設定した条件に合ったもののみが記録されます。どれだけ時間がかかっていても実行中のSQL文は記録されません。現在実行中のSQL文の状況を知るにはSHOW PROCESSLIST文を使用します。SQL文が1,000文字を超える長さがあり得る場合は,
Command列がQueryである行がSQL文を実行中のクライアントの情報です。Info列の内容の実行時間がTime列に表示されます。Command列がSleepでTime列の値が大きいものは,
図4 SHOW FULL PROCESSLIST文の出力例
mysql> SHOW FULL PROCESSLIST\G *************************** 1. row *************************** Id: 1004 User: root Host: localhost db: NULL Command: Query Time: 0 State: init Info: SHOW FULL PROCESSLIST *************************** 2. row *************************** Id: 3225 User: root Host: localhost db: mysqlslap Command: Query Time: 0 State: Writing to net Info: SELECT intcol1,charcol1 FROM t1 (省略)
SQL文の処理時間が想定外に長すぎる場合などは,
SYSスキーマのPROCESSLISTテーブルからでも同様の情報が得られ,
実行計画の確認
MySQLサーバのオプティマイザが,
図5 EXPLAIN文の実行例
mysql> EXPLAIN -> SELECT a.Name, a.District FROM City AS a -> INNER JOIN Country ON a.CountryCode = Country.Code -> WHERE Country.Code = 'JPN' AND a.Population >= -> (SELECT MAX(City.Population) FROM City -> INNER JOIN Country ON City.CountryCode = Country.Code -> WHERE Country.Name = 'Malaysia'); +----+-------------+---------+-------+---------------+-------------+---------+-------------------+------+------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+-------+---------------+-------------+---------+-------------------+------+------------------------------------+ | 1 | PRIMARY | Country | const | PRIMARY | PRIMARY | 3 | const | 1 | Using index | | 1 | PRIMARY | a | ref | CountryCode | CountryCode | 3 | const | 249 | Using index condition; Using where | | 2 | SUBQUERY | Country | ALL | PRIMARY | NULL | NULL | NULL | 239 | Using where | | 2 | SUBQUERY | City | ref | CountryCode | CountryCode | 3 | test.Country.Code | 9 | NULL | +----+-------------+---------+-------+---------------+-------------+---------+-------------------+------+------------------------------------+ 4 rows in set (0.00 sec)
上記の例では様々な情報が得られます。
- サブクエリ内でCountryテーブルのフルテーブルスキャンでデータを絞り込み
(3行目のALL) - CityテーブルのCountryCode列のインデックスを使ってCountryテーブルとでJOIN
(4行目のref) - その値とCityテーブルのPopulation列と比較
(2行目のUsing where) - Countryテーブルの主キーと定数
“JPN” で絞り込み (1行目のconstおよびPRIMARY)
処理の順序やテーブルスキャンなどの課題の有無をより視覚的にわかりやすくするために,
上記の例のようにテーブルスキャンが行われているテーブルは,
各テーブル名の右上には,