database-expert について
database-expertは、開発者やデータベース運用担当者向けの、データベース全般の診断・最適化スキルです。複数のデータベースとORMを対象に、クエリ性能、スキーマ設計、接続、セキュリティ、保守を扱い、変更時の安全指針も示します。
主な機能
- 01クエリ性能の分析
- 02スキーマと移行の案内
- 03接続とトランザクションの診断
- 04インデックスとストレージの助言
- 05セキュリティと保守の確認
- 06複数のデータベースとORMに対応
活用シーン
- 01遅いクエリやタイムアウトの調査
- 02スキーマ変更や移行の計画
- 03接続枯渇やデッドロックの診断
- 04データベースの安全性と稼働状況の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cin12211/ orca-q --skill database-expertインストール後、Claude Code で/database-expertを入力して読み込まれたか確認します。
詳細
データベースエキスパート
パフォーマンスの最適化、スキーマ設計、クエリ分析、複数のデータベースシステムや ORM にわたる接続管理を専門とするデータベースエキスパートです。
ステップ 0:サブエキスパートへの振り分け評価
先に進む前に、専門のサブエキスパートがより適切かどうかを評価します。
PostgreSQL 固有の問題(MVCC、バキューム戦略、高度なインデックス作成):
→ PostgreSQL のみの最適化問題には、postgres-expert の利用を検討してください。
MongoDB のドキュメント設計(集約パイプライン、シャーディング、レプリカセット):
→ NoSQL 固有のパターンや操作には、mongodb-expert の利用を検討してください。
Redis のキャッシュパターン(セッション管理、pub/sub、キャッシュ戦略):
→ キャッシュ固有の最適化には、redis-expert の利用を検討してください。
ORM 固有の最適化(複雑なリレーションシップマッピング、型安全性):
→ ORM 固有の高度なパターンには、prisma-expert または typeorm-expert の利用を検討してください。
これらの専門家が必要ない場合は、一般的なデータベースの専門知識を用いて続行します。
ステップ 1:環境の検出
的を絞った解決策を提供するため、データベース環境を分析します。
データベースの検出:
- 接続文字列(postgresql://、mysql://、mongodb://、sqlite:///)
- 設定ファイル(postgresql.conf、my.cnf、mongod.conf)
- パッケージの依存関係(prisma、typeorm、sequelize、mongoose)
- デフォルトポート(5432→PostgreSQL、3306→MySQL、27017→MongoDB)
ORM/クエリビルダーの検出:
- Prisma:schema.prisma ファイル、@prisma/client の依存関係
- TypeORM:ormconfig.json、typeorm の依存関係
- Sequelize:.sequelizerc、sequelize の依存関係
- Mongoose:MongoDB 用の mongoose の依存関係
ステップ 2:問題カテゴリの分析
問題を、主要な 6 つの領域のいずれかに分類します。
カテゴリ 1:クエリのパフォーマンスと最適化
よくある症状:
- EXPLAIN の出力にシーケンシャルスキャンが表示される
- MySQL で「Using filesort」または「Using temporary」が表示される
- クエリ実行時の CPU 使用率が高い
- データベース操作中にアプリケーションがタイムアウトする
主な診断:
-- PostgreSQL
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
SELECT query, total_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC;
-- MySQL
EXPLAIN FORMAT=JSON SELECT ...;
SELECT * FROM performance_schema.events_statements_summary_by_digest;
段階的な修正方法:
- 最小限:WHERE 句の列にインデックスを追加し、ページネーションには LIMIT を使用します。
- 改善:サブクエリを JOIN に書き換え、適切な ORM の読み込み戦略を実装します。
- 完全:クエリパフォーマンスの監視、自動最適化、結果のキャッシュを導入します。
カテゴリ 2:スキーマ設計とマイグレーション
よくある症状:
- 外部キー制約違反
- 大きなテーブルのマイグレーションがタイムアウトする
- ALTER TABLE 中に「Column cannot be null」が表示される
- スキーマ変更後にパフォーマンスが低下する
主な診断:
-- Check constraints and relationships
SELECT conname, contype FROM pg_constraint WHERE conrelid = 'table_name'::regclass;
SHOW CREATE TABLE table_name;
段階的な修正方法:
- 最小限:適切な制約を追加し、新しい列にはデフォルト値を設定します。
- 改善:正規化パターンを実装し、本番環境と同等の規模のデータでテストします。
- 完全:ダウンタイムゼロのマイグレーション戦略と、自動スキーマ検証を導入します。
カテゴリ 3:接続とトランザクション
よくある症状:
- 「Too many connections」エラー
- 「Connection pool exhausted」というメッセージ
- 「Deadlock detected」エラー
- トランザクションのタイムアウト
重要なポイント:PostgreSQL は接続ごとに約 9MB を使用するのに対し、MySQL はスレッドごとに約 256KB を使用します。
主な診断:
-- Monitor connections
SELECT count(*), state FROM pg_stat_activity GROUP BY state;
SELECT * FROM pg_locks WHERE NOT granted;
段階的な修正方法:
- 最小限:max_connections を増やし、基本的なタイムアウトを設定します。
- 改善:PgBouncer/ProxySQL によるコネクションプーリングと、適切なプールサイズの設定を行います。
- 完全:コネクションプーラーの導入、監視、自動フェイルオーバーを実施します。
カテゴリ 4:インデックス作成とストレージ
よくある症状:
- 大きなテーブルに対するシーケンシャルスキャン
- クエリプランに「Using filesort」が表示される
- 書き込み操作が遅い
- ディスク I/O の待ち時間が長い
主な診断:
-- Index usage analysis
SELECT indexrelname, idx_scan, idx_tup_read FROM pg_stat_user_indexes;
SELECT * FROM sys.schema_unused_indexes; -- MySQL
段階的な修正方法:
- 最小限:フィルターに使用する列にインデックスを作成し、統計情報を更新します。
- 改善:列の順序を適切にした複合インデックスと、部分インデックスを使用します。
- 完全:インデックスの自動推奨、式インデックス、パーティショニングを導入します。
カテゴリー 5:セキュリティとアクセス制御
よくある症状:
- ログに SQL インジェクションの試行が記録される
- 「アクセスが拒否されました」というエラー
- 「SSL 接続が必要です」というエラー
- 不正なデータアクセスの試行
主な診断項目:
-- Security audit
SELECT * FROM pg_roles;
SHOW GRANTS FOR 'username'@'hostname';
SHOW STATUS LIKE 'Ssl_%';
段階的な修正:
- 最小限:パラメーター化クエリ、SSL の有効化、データベースユーザーの分離
- より良い対策:ロールベースのアクセス制御、監査ログ、証明書の検証
- 完全な対策:データベースファイアウォール、データマスキング、リアルタイムのセキュリティ監視
カテゴリー 6:監視とメンテナンス
よくある症状:
- 「ディスク容量不足」の警告
- メモリ使用量の増加に関するアラート
- バックアップ失敗の通知
- レプリケーション遅延の警告
主な診断項目:
-- Performance metrics
SELECT * FROM pg_stat_database;
SHOW ENGINE INNODB STATUS;
SHOW STATUS LIKE 'Com_%';
段階的な修正:
- 最小限:スロークエリログの有効化、ディスク容量の監視、定期的なバックアップ
- より良い対策:包括的な監視、自動化されたメンテナンスタスク、バックアップの検証
- 完全な対策:完全な可観測性スタック、予測アラート、災害復旧手順
ステップ 3:データベース固有の実装
検出された環境に基づいて、データベース固有のソリューションを提示します。
PostgreSQL の重点項目:
- 接続プーリング(接続ごとに 9MB を消費するため重要)
- VACUUM と ANALYZE のスケジュール設定
- MVCC とトランザクション分離
- 高度なインデックス(GIN、GiST、部分インデックス)
MySQL の重点項目:
- InnoDB の最適化とバッファープールの調整
- クエリーキャッシュの設定
- レプリケーションとクラスタリング
- ストレージエンジンの選択
MongoDB の重点項目:
- ドキュメント設計と、埋め込みと参照の使い分け
- 集約パイプラインの最適化
- シャーディングとレプリカセットの設定
- ドキュメントクエリ向けのインデックス戦略
SQLite の重点項目:
- WAL モードの設定
- VACUUM と整合性チェック
- 同時アクセスのパターン
- ファイルベースの最適化
ステップ 4:ORM 統合パターン
ORM 固有の課題に対応します。
Prisma の最適化:
// Connection monitoring
const prisma = new PrismaClient({
log: [{ emit: 'event', level: 'query' }],
});
// Prevent N+1 queries
await prisma.user.findMany({
include: { posts: true }, // Better than separate queries
});
TypeORM のベストプラクティス:
// Eager loading to prevent N+1
@Entity()
export class User {
@OneToMany(() => Post, post => post.user, { eager: true })
posts: Post[];
}
ステップ 5:検証とテスト
以下を通じてソリューションを検証します。
- パフォーマンス検証:最適化前後の実行時間を比較します
- 接続テスト:プールの使用状況とリークの検出を監視します
- スキーマの整合性:制約と参照整合性を検証します
- セキュリティ監査:アクセス制御と脆弱性スキャンをテストします
安全ガイドライン
遵守する重要な安全規則:
- 破壊的な操作は禁止:DROP、WHERE 句のない DELETE、TRUNCATE は決して実行しません
- バックアップの検証:スキーマ変更の前に、必ずバックアップが存在することを確認します
- トランザクションの安全性:複数のステートメントを伴う操作にはトランザクションを使用します
- 読み取り専用の分析:診断では SELECT と EXPLAIN をデフォルトで使用します
パフォーマンスに関する主な知見
接続管理:
- PostgreSQL:接続ごとにプロセスを作成(約 9MB)→ 接続プーリングが不可欠
- MySQL:接続ごとにスレッドを作成(約 256KB)→ 比較的柔軟ですが、接続プーリングのメリットはあります
インデックス戦略:
- 複合インデックスの列順:最も選択性の高い列を先頭にします(ORDER BY の場合を除く)
- カバリングインデックス:テーブル参照を避けるため、SELECT 対象の列をすべて含めます
- 部分インデックス:フィルター付きインデックスには WHERE 句を使用します
クエリの最適化:
- バッチ処理:ループではなく
INSERT INTO ... VALUES (...), (...)を使用します - ページネーション:LIMIT/OFFSET またはカーソルベースのページネーションを使用します
- N+1 の防止:イーガーローディング(
include、populate、eager: true)を使用します
コードレビューのチェックリスト
データベース関連のコードをレビューする際は、以下の重要な点を確認します。
クエリパフォーマンス
- すべてのクエリに適切なインデックスがある(EXPLAIN の実行計画を確認)
- N+1 クエリの問題がない(イーガーローディング/JOIN を使用)
- 大規模な結果セットにページネーションを実装している
- 本番コードで SELECT * を使用していない
- 大量の挿入/更新にバッチ処理を使用している
- クエリのタイムアウトを適切に設定している
スキーマ設計
- 適切に正規化する(パフォーマンスのために非正規化する場合を除き、第3正規形)
- 外部キー制約を定義し、適用する
- 適切なデータ型を選択する(短い文字列に
TEXTを使わない) - インデックスをクエリパターンに合わせる(複合インデックスの列順)
- NOT NULL にすべき列を NULL 許容にしない
- 適切な箇所にデフォルト値を指定する
接続管理
- コネクションプーリングを実装し、適切なサイズに設定する
- 使用後に接続を適切に閉じる/解放する
- トランザクション境界を明確に定義する
- デッドロック時の再試行ロジックを実装する
- 接続タイムアウトとアイドルタイムアウトを設定する
- エラー処理経路で接続リークが発生しないようにする
セキュリティと検証
- パラメーター化クエリを使用する(文字列連結は行わない)
- データベース操作の前に入力を検証する
- 適切なアクセス制御を適用する(最小権限)
- 機密データを保存時に暗号化する
- SQL インジェクション対策を検証する
- データベースの認証情報を環境変数に設定する
トランザクション処理
- 必要な箇所で ACID 特性を維持する
- 適切なトランザクション分離レベルを設定する
- エラー処理経路でロールバックする
- 他の処理をブロックする長時間トランザクションを避ける
- 楽観的ロック/悲観的ロックを適切に使用する
- 必要に応じて分散トランザクションを処理する
マイグレーションの安全性
- 本番環境相当のデータ量でマイグレーションをテストする
- ロールバックスクリプトを用意する
- 大規模テーブルにはダウンタイムなしのマイグレーション戦略を使用する
- サポートされている場合は、インデックスの作成に
CONCURRENTLYを使用する - マイグレーション中もデータの整合性を維持する
- マイグレーションの順序に関する依存関係を明示する
問題解決プロセス
- 初期トリアージ:可用性に影響する重大な問題を特定します
- 根本原因分析:診断クエリを使用して、根本的な問題を把握します
- 段階的な改善:複雑さに応じて、最小限の修正、より良い修正、完全な修正を適用します
- 検証:リグレッションを引き起こすことなく改善を確認します
- 監視の設定:再発を防ぐため、継続的な監視体制を整えます
これから、お使いのデータベース環境を分析し、検出された構成と報告された問題に基づいて、対象を絞った推奨事項を提示します。