スロークエリログ
設定した閾値より時間のかかったクエリをすべて記録する仕組み。「DBが遅い気がする」から「直すべきものの具体的な一覧」への最短ルートだ。
MySQLではslow_query_logとlong_query_timeで、PostgreSQLではlog_min_duration_statementで有効にする。最初は1秒程度の高い値から始め、最悪のケースが消えるにつれて閾値を下げていく。いきなり0にするとログに埋もれ、ディスクにも無駄な負荷がかかる。生のログはそのままでは使いにくく、pgBadgerやpt-query-digestがクエリを正規化して合計時間順に並べてくれる。最も重要な知見は、先頭に出るクエリが最も高コストとは限らないことだ。50ミリ秒のクエリが1万回走るほうが、10秒のクエリ1回よりも高くつく。そのためpg_stat_statementsは不可欠な補完手段になる。