mcpField
D
database-optimizer

database-optimizer

github.com/farmageデータ・データベース223306 回インストール5 週間前に更新
リポジトリ

database-optimizer について

Database Optimizerは、複数のデータベースシステムの性能診断とチューニングを支援するスキルです。測定した基準値と実行計画をもとに変更を段階的に適用し、前後を検証します。

主な機能

  1. 01基準値の取得と実行計画の分析
  2. 02クエリおよびインデックス戦略の設計
  3. 03スキーマと設定のチューニング
  4. 04変更の段階的な適用と監視
  5. 05最適化前後の性能検証

活用シーン

  1. 01遅いクエリやボトルネックの調査
  2. 02インデックスやスキーマ変更の計画
  3. 03データベース調整による性能影響の確認

インストール

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

$npx skills add https://github.com/farmage/opencode-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

詳細

Database Optimizer

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

このスキルを使用する場面

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

基本ワークフロー

  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. モニタリングの推奨事項

ドキュメント

コメント