mysql について
MySQL に特化したリファレンススキルで、テーブル設計、クエリ、トラブルシューティング、運用上の注意を扱います。PostgreSQL との違いや、別のデータベーススキルを使うケースも示します。
主な機能
- 01テーブル定義の例
- 02一般的なクエリパターン
- 03MySQL と PostgreSQL の違い
- 04クエリのアンチパターン指針
- 05トラブルシューティング資料
活用シーン
- 01MySQL のテーブルとインデックスの設計
- 02ページングや結合クエリの作成
- 03遅いクエリやデッドロックの調査
- 04用途に合うデータベーススキルの選択
MCP 対応
README では、包括的なドキュメントを取得するため `mcp__documentation__fetch_docs` に technology として `mysql` を指定するよう案内しています。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill mysqlインストール後、Claude Code で/mysqlを入力して読み込まれたか確認します。
同梱ファイルquick-ref/indexes.mdquick-ref/queries.md
詳細
MySQL の基礎知識
詳しい知識:包括的なドキュメントを参照するには、technology:
mysqlを指定してmcp__documentation__fetch_docsを使用してください。
テーブル定義
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE,
INDEX idx_email (email),
INDEX idx_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
よく使うクエリ
-- Pagination
SELECT * FROM users
WHERE is_active = TRUE
ORDER BY created_at DESC
LIMIT 20 OFFSET 0;
-- Join
SELECT u.*, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON p.user_id = u.id
GROUP BY u.id;
-- Upsert
INSERT INTO users (email, name)
VALUES (?, ?)
ON DUPLICATE KEY UPDATE name = VALUES(name);
PostgreSQL との主な違い
| 機能 | MySQL | PostgreSQL |
|---|---|---|
| 自動 ID | AUTO_INCREMENT | SERIAL |
| Boolean | TINYINT(1) | BOOLEAN |
| アップサート | ON DUPLICATE KEY | ON CONFLICT |
| JSON | JSON | JSONB(インデックス付き) |
このスキルを使用しない場合
- PostgreSQL 固有の機能 - JSONB、配列、ウィンドウ関数には
postgresqlスキルを使用してください - NoSQL 操作 - ドキュメントストア/キー・バリューストアには
mongodbまたはredisスキルを使用してください - Oracle データベース - Oracle 固有の機能には
oracleスキルを使用してください - SQL Server - T-SQL および SQL Server の機能には
sqlserverスキルを使用してください - ORM の抽象化 - フレームワーク固有のスキル(Prisma、TypeORM、Sequelize)を使用してください
アンチパターン
| アンチパターン | 問題 | 解決策 |
|---|---|---|
本番環境での SELECT * | 不要なデータを転送し、パフォーマンスに影響します | 必要なカラムを明示的に指定してください |
UPDATE/DELETE での WHERE の欠落 | 意図せずすべての行を変更します | 必ず WHERE 句を含めてください |
| JOIN/WHERE 対象カラムのインデックス不足 | 全表スキャンが発生し、クエリが遅くなります | 頻繁にクエリされるカラムにインデックスを追加してください |
| トランザクションデータでの MyISAM | トランザクションをサポートせず、テーブルレベルでロックします | InnoDB エンジンを使用してください |
LIKE '%pattern' | インデックスを使用できず、全件スキャンになります | LIKE 'pattern%' または全文検索を使用してください |
大きなテーブルでの LIMIT の欠落 | アプリケーションがクラッシュする可能性があります | 必ず結果をページ分割してください |
頻繁に変更される値への ENUM の使用 | 値の追加に ALTER TABLE が必要です | 代わりにルックアップテーブルを使用してください |
| 外部キーの欠落 | データ整合性の問題が発生します | 適切な FK 制約を定義してください |
| N+1 クエリ問題 | ループ内で行ごとにクエリが実行されます | JOIN またはバッチクエリを使用してください |
| プリペアドステートメントを使用しない | SQL インジェクションのリスクがあり、パフォーマンスも低下します | パラメーター化されたクエリを使用してください |
迅速なトラブルシューティング
| 問題 | 診断 | 解決策 |
|---|---|---|
| クエリが遅い | EXPLAIN SELECT ... | インデックスを追加し、クエリを書き換え、実行計画を分析してください |
| CPU 使用率が高い | SHOW PROCESSLIST で遅いクエリを特定します | 上位のクエリを最適化し、インデックスを追加してください |
| 接続数の上限に達した | SHOW STATUS LIKE 'Threads_connected' | max_connections を増やし、コネクションプーリングを使用してください |
| ロック待ちタイムアウト | SHOW ENGINE INNODB STATUS を確認します | トランザクション時間を短縮し、クエリを最適化してください |
| ディスク容量がいっぱい | SELECT table_schema, SUM(data_length+index_length) FROM information_schema.tables GROUP BY 1 | 古いデータをアーカイブし、テーブルを最適化してください |
| レプリケーション遅延 | SHOW SLAVE STATUS | リソースを増やし、binlog の設定を調整してください |
| テーブル破損 | CHECK TABLE table_name | REPAIR TABLE を実行するか、バックアップから復元してください |
| デッドロック | エラーログと SHOW ENGINE INNODB STATUS を確認します | トランザクションの範囲を縮小し、同じ順序でテーブルにアクセスしてください |
参考ドキュメント
コメント
Markdown 対応