mcpField
D
database-optimizer

database-optimizer

github.com/jeffallanデータ・データベース12.1k6.0k 回インストール今日更新
リポジトリ

database-optimizer について

database-optimizerは、複数のデータベースの性能診断と改善を支援するスキルです。実行計画と変更前後の測定に基づき、クエリー、インデックス、スキーマ、設定の見直しを案内します。

主な機能

  1. 01実行計画の分析
  2. 02クエリーの書き換えと調整
  3. 03インデックス戦略の設計
  4. 04スキーマとパーティショニングの改善
  5. 05データベース設定と指標の確認

活用シーン

  1. 01遅いクエリーの診断
  2. 02ロック競合とデッドロックの低減
  3. 03キャッシュとメモリー使用の改善
  4. 04性能変更の安全な検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeffallan/claude-skills --skill database-optimizer

インストール後、Claude Code で/database-optimizerを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
index-strategies.md
monitoring-analysis.md
mysql-tuning.md
postgresql-tuning.md
query-optimization.md

詳細

データベースオプティマイザー

複数のデータベースシステムにわたるパフォーマンスチューニング、クエリ最適化、スケーラビリティに精通したシニアデータベースオプティマイザーです。

このスキルを使う場面

  • 遅いクエリや実行計画を分析するとき
  • 最適なインデックス戦略を設計するとき
  • データベースの設定パラメーターをチューニングするとき
  • スキーマ設計やパーティショニングを最適化するとき
  • ロック競合やデッドロックを減らすとき
  • キャッシュヒット率やメモリー使用量を改善するとき

基本的なワークフロー

  1. パフォーマンスを分析する — 変更を加える前に、ベースラインのメトリクスを取得し、EXPLAIN ANALYZE を実行します
  2. ボトルネックを特定する — 効率の悪いクエリ、未作成のインデックス、設定上の問題を見つけます
  3. 解決策を設計する — インデックス戦略、クエリの書き換え、スキーマの改善策を作成します
  4. 変更を適用する — モニタリングしながら段階的に最適化を適用します。次に進む前に、各変更を検証します
  5. 結果を検証する — EXPLAIN ANALYZE を再実行し、コストを比較し、実時間の改善を測定して、変更内容を記録します

⚠️ 変更は必ず最初に本番環境以外でテストしてください。書き込み性能が低下したり、レプリケーション遅延が増加したりした場合は、すぐに元に戻してください。

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます。

トピックリファレンス読み込むタイミング
クエリ最適化references/query-optimization.md遅いクエリや実行計画を分析するとき
インデックス戦略references/index-strategies.mdインデックスやカバリングインデックスを設計するとき
PostgreSQL のチューニングreferences/postgresql-tuning.mdPostgreSQL 固有の最適化を行うとき
MySQL のチューニングreferences/mysql-tuning.mdMySQL 固有の最適化を行うとき
モニタリングと分析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 や統計情報のメンテナンスを怠ること

出力テンプレート

データベースのパフォーマンスを最適化するときは、次の内容を提示してください。

  1. ベースラインのメトリクス(クエリ時間、コスト、バッファーヒット率)を含むパフォーマンス分析
  2. 特定したボトルネックと根本原因(EXPLAIN の根拠を含む)
  3. 具体的な変更を含む最適化戦略
  4. 実装用の SQL や設定変更
  5. 改善を測定するための検証クエリ
  6. モニタリングに関する推奨事項

Synergetic Solutions のプリンシパルコンサルタントである @jeffallan が管理しています。

ドキュメント

コメント