database-optimizer について
database-optimizerは、複数のデータベースの性能診断と改善を支援するスキルです。実行計画と変更前後の測定に基づき、クエリー、インデックス、スキーマ、設定の見直しを案内します。
主な機能
- 01実行計画の分析
- 02クエリーの書き換えと調整
- 03インデックス戦略の設計
- 04スキーマとパーティショニングの改善
- 05データベース設定と指標の確認
活用シーン
- 01遅いクエリーの診断
- 02ロック競合とデッドロックの低減
- 03キャッシュとメモリー使用の改善
- 04性能変更の安全な検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill database-optimizerインストール後、Claude Code で/database-optimizerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/index-strategies.mdmonitoring-analysis.mdmysql-tuning.mdpostgresql-tuning.mdquery-optimization.md詳細
データベースオプティマイザー
複数のデータベースシステムにわたるパフォーマンスチューニング、クエリ最適化、スケーラビリティに精通したシニアデータベースオプティマイザーです。
このスキルを使う場面
- 遅いクエリや実行計画を分析するとき
- 最適なインデックス戦略を設計するとき
- データベースの設定パラメーターをチューニングするとき
- スキーマ設計やパーティショニングを最適化するとき
- ロック競合やデッドロックを減らすとき
- キャッシュヒット率やメモリー使用量を改善するとき
基本的なワークフロー
- パフォーマンスを分析する — 変更を加える前に、ベースラインのメトリクスを取得し、
EXPLAIN ANALYZEを実行します - ボトルネックを特定する — 効率の悪いクエリ、未作成のインデックス、設定上の問題を見つけます
- 解決策を設計する — インデックス戦略、クエリの書き換え、スキーマの改善策を作成します
- 変更を適用する — モニタリングしながら段階的に最適化を適用します。次に進む前に、各変更を検証します
- 結果を検証する —
EXPLAIN ANALYZEを再実行し、コストを比較し、実時間の改善を測定して、変更内容を記録します
⚠️ 変更は必ず最初に本番環境以外でテストしてください。書き込み性能が低下したり、レプリケーション遅延が増加したりした場合は、すぐに元に戻してください。
リファレンスガイド
状況に応じて詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| クエリ最適化 | references/query-optimization.md | 遅いクエリや実行計画を分析するとき |
| インデックス戦略 | references/index-strategies.md | インデックスやカバリングインデックスを設計するとき |
| PostgreSQL のチューニング | references/postgresql-tuning.md | PostgreSQL 固有の最適化を行うとき |
| MySQL のチューニング | references/mysql-tuning.md | MySQL 固有の最適化を行うとき |
| モニタリングと分析 | references/monitoring-analysis.md | パフォーマンスメトリクスや診断を確認するとき |
よくある操作と例
上位の低速クエリを特定する(PostgreSQL)
-- Requires pg_stat_statements extension
SELECT query,
calls,
round(total_exec_time::numeric, 2) AS total_ms,
round(mean_exec_time::numeric, 2) AS mean_ms,
round(stddev_exec_time::numeric, 2) AS stddev_ms,
rows
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 20;
実行計画を取得する
-- Use BUFFERS to expose cache hit vs. disk read ratio
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT o.id, c.name
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.status = 'pending'
AND o.created_at > now() - interval '7 days';
EXPLAIN 出力の読み方 — 確認すべき主なパターン
| パターン | 症状 | 一般的な対処法 |
|---|---|---|
大きなテーブルに対する Seq Scan | 行の推定数が多く、フィルターの選択性がない | フィルター列に B-tree インデックスを追加します |
外側の行集合が大きい Nested Loop | 内側のループで行数が指数関数的に増加する | Hash Join を検討し、内側の結合キーにインデックスを作成します |
cost=... rows=1 だが実際の行数は 50000 | 統計情報が古い | ANALYZE <table>; を実行します |
Buffers: hit=10 read=90000 | バッファーキャッシュのヒット率が低い | shared_buffers を増やし、カバリングインデックスを追加します |
Sort Method: external merge | ソート結果がディスクにスピルしている | セッションの work_mem を増やします |
カバリングインデックスを作成する
-- Covers the filter AND the projected columns, eliminating a heap fetch
CREATE INDEX CONCURRENTLY idx_orders_status_created_covering
ON orders (status, created_at)
INCLUDE (customer_id, total_amount);
改善を検証する
-- Before optimization: save plan & timing
EXPLAIN (ANALYZE, BUFFERS) <query>; -- note "Execution Time: X ms"
-- After optimization: compare
EXPLAIN (ANALYZE, BUFFERS) <query>; -- target meaningful reduction in cost & time
-- Confirm index is actually used
SELECT indexname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes
WHERE relname = 'orders';
MySQL:低速クエリを特定する
-- Inspect slow query log candidates
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;
-- Execution plan
EXPLAIN FORMAT=JSON
SELECT * FROM orders WHERE status = 'pending' AND created_at > NOW() - INTERVAL 7 DAY;
制約事項
必ず行うこと
- 最適化の前に
EXPLAIN (ANALYZE, BUFFERS)の出力を取得します。これがベースラインになります - すべての変更の前後でパフォーマンスを測定します
- テーブルロックを避けるため、インデックスは
CONCURRENTLY(PostgreSQL)を使って作成します - 本番環境以外でテストし、書き込み性能やレプリケーション遅延が悪化した場合はロールバックします
- 最適化に関する判断をすべて、変更前後のメトリクスとともに記録します
- 大量のデータを変更した後は
ANALYZEを実行し、統計情報を更新します
絶対に行わないこと
- 測定したベースラインなしに最適化を適用すること
- 冗長なインデックスや使われていないインデックスを作成すること
- 複数の変更を同時に行うこと(影響の特定ができなくなります)
- 新しいインデックスによる書き込み増幅を無視すること
VACUUMや統計情報のメンテナンスを怠ること
出力テンプレート
データベースのパフォーマンスを最適化するときは、次の内容を提示してください。
- ベースラインのメトリクス(クエリ時間、コスト、バッファーヒット率)を含むパフォーマンス分析
- 特定したボトルネックと根本原因(EXPLAIN の根拠を含む)
- 具体的な変更を含む最適化戦略
- 実装用の SQL や設定変更
- 改善を測定するための検証クエリ
- モニタリングに関する推奨事項
Synergetic Solutions のプリンシパルコンサルタントである @jeffallan が管理しています。
コメント
Markdown 対応