「スロークエリログ(Slow Query Log)」とは、データベースにおいて実行に時間がかかったSQLクエリ(遅いクエリ)を記録するログです。 主にMySQLやMariaDBで使われる機能ですが、他のRDBMS(PostgreSQLなど)にも似た機能があります。 ◆ スロークエリログの目的 * 遅いクエリを特定し、パフォーマンスを改善するため * インデックス不足、不要なJOIN、大量データのスキャンなどの原因を見つける ◆ ログに記録される主な情報(MySQLの例) * 実行時間(何秒かかったか) * 実行されたSQL文 * ロック時間(テーブルをロックしていた時間) * 取得・スキャンした行数(Rows Examined) * 実行時のユーザーやホスト情報 ◆ どうやって使うの? 1. 有効化する(MySQLの例) ```sql
SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; -- 1秒以上かかったクエリだけ記録
```
SHOW VARIABLES LIKE 'slow_query_log_file';
``` 3. ログの分析 ログファイルはテキスト形式で読み取れますが、以下のようなツールで分析するのが一般的です:
* `mysqldumpslow`(MySQLに付属) * `pt-query-digest`(Percona Toolkitの一部)
# Time: 2025-06-07T13:45:12.234567Z # User@Host: user[user] @ localhost [] # Query_time: 3.456 Lock_time: 0.000 Rows_sent: 10 Rows_examined: 100000
SELECT * FROM users WHERE email LIKE '%@example.com';
```
この例では、`users`テーブルからメールアドレスをあいまい検索しているクエリが3.4秒かかっていることが分かります。 インデックスが使われていない可能性があります。 ◆ 注意点 * 開発環境や本番環境で使い方が異なります。 本番で有効にするとディスクI/Oが増える可能性があるので注意が必要です。 * クエリチューニング(改善)の第一歩として非常に有効です。 ◆ 補足:PostgreSQLの場合 PostgreSQLではスロークエリログに相当する機能として、`log_min_duration_statement` という設定があります。 ```sql
SET log_min_duration_statement = 1000; -- 1秒以上かかるSQLだけログ
```
|