mysql
世界中で広く使われているオープンソースのデータベース管理システムMySQLについて、インストールからSQLクエリ、効率的な索引の使い方、データの複製設定、Node.jsやPythonとの連携まで、ビジネスで活用するための基礎を習得するSkill。
📜 元の英語説明(参考)
MySQL is the world's most popular open-source relational database management system. Learn installation, SQL queries, indexing strategies, replication setup, and client integration with Node.js (mysql2) and Python (mysql-connector).
🇯🇵 日本人クリエイター向け解説
世界中で広く使われているオープンソースのデータベース管理システムMySQLについて、インストールからSQLクエリ、効率的な索引の使い方、データの複製設定、Node.jsやPythonとの連携まで、ビジネスで活用するための基礎を習得するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o mysql.zip https://jpskill.com/download/15150.zip && unzip -o mysql.zip && rm mysql.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15150.zip -OutFile "$d\mysql.zip"; Expand-Archive "$d\mysql.zip" -DestinationPath $d -Force; ri "$d\mysql.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
mysql.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
mysqlフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
MySQL
MySQL は、小規模なアプリケーションから大規模なウェブプラットフォームまでで使用される、堅牢なリレーショナルデータベースです。ACID トランザクション、レプリケーション、および広範な SQL 機能をサポートしています。
インストール
# Docker (開発用として推奨)
docker run -d --name mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
mysql:8
# Ubuntu/Debian
sudo apt-get install mysql-server
sudo mysql_secure_installation
# macOS
brew install mysql && brew services start mysql
# Node.js ドライバー
npm install mysql2
# Python ドライバー
pip install mysql-connector-python
CLI の基本
# MySQL に接続
mysql -u root -p
# 特定のデータベースに接続
mysql -u root -p myapp
# コマンドラインからクエリを実行
mysql -u root -p -e "SHOW DATABASES;"
# SQL ファイルをインポート
mysql -u root -p myapp < schema.sql
# データベースをエクスポート
mysqldump -u root -p myapp > backup.sql
スキーマ設計
-- schema.sql: 適切な型、インデックス、および制約を持つテーブルを作成
CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE myapp;
CREATE TABLE users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_created (created_at)
) ENGINE=InnoDB;
CREATE TABLE orders (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL,
total_cents INT UNSIGNED NOT NULL DEFAULT 0,
status ENUM('pending','paid','shipped','completed','cancelled') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user_status (user_id, status)
) ENGINE=InnoDB;
インデックス戦略
-- indexing.sql: パフォーマンスのための一般的なインデックスパターン
-- 複数カラムのクエリのための複合インデックス (最左プレフィックスルール)
CREATE INDEX idx_orders_status_date ON orders(status, created_at);
-- カバーリングインデックス — クエリがインデックスのみで完結
CREATE INDEX idx_users_email_name ON users(email, name);
-- 検索のためのフルテキストインデックス
ALTER TABLE products ADD FULLTEXT INDEX ft_search (name, description);
SELECT * FROM products WHERE MATCH(name, description) AGAINST('laptop' IN BOOLEAN MODE);
-- クエリ実行計画の確認
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
Node.js と mysql2
// db.js: mysql2 と Promise API を使用した MySQL コネクションプール
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'root',
password: process.env.DB_PASS || 'secret',
database: 'myapp',
waitForConnections: true,
connectionLimit: 10,
charset: 'utf8mb4',
});
async function getUser(id) {
const [rows] = await pool.execute(
'SELECT id, email, name FROM users WHERE id = ?',
[id]
);
return rows[0] || null;
}
async function createOrder(userId, totalCents) {
const conn = await pool.getConnection();
try {
await conn.beginTransaction();
const [result] = await conn.execute(
'INSERT INTO orders (user_id, total_cents) VALUES (?, ?)',
[userId, totalCents]
);
await conn.commit();
return result.insertId;
} catch (err) {
await conn.rollback();
throw err;
} finally {
conn.release();
}
}
module.exports = { pool, getUser, createOrder };
Python クライアント
# db.py: mysql-connector-python を使用した MySQL 接続
import mysql.connector
from mysql.connector import pooling
pool = pooling.MySQLConnectionPool(
pool_name="myapp",
pool_size=5,
host="localhost",
user="root",
password="secret",
database="myapp",
charset="utf8mb4",
)
def get_user(user_id):
conn = pool.get_connection()
try:
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT id, email, name FROM users WHERE id = %s", (user_id,))
return cursor.fetchone()
finally:
conn.close()
def insert_users(users):
conn = pool.get_connection()
try:
cursor = conn.cursor()
cursor.executemany(
"INSERT INTO users (email, name, password_hash) VALUES (%s, %s, %s)",
users,
)
conn.commit()
finally:
conn.close()
レプリケーション設定
# my.cnf (プライマリ): レプリケーションのためにバイナリロギングを有効化
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
-- replication.sql: プライマリを追跡するようにレプリカを設定
-- プライマリ上: レプリケーションユーザーを作成
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- レプリカ上: レプリケーションを開始
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='primary-host',
SOURCE_USER='repl',
SOURCE_PASSWORD='repl_password',
SOURCE_AUTO_POSITION=1;
START REPLICA;
SHOW REPLICA STATUS\G
バックアップとメンテナンス
# backup.sh: 圧縮による自動バックアップ
mysqldump -u root -p --single-transaction --routines --triggers myapp | gzip > "backup_$(date +%Y%m%d).sql.gz"
# バックアップから復元
gunzip < backup_20260219.sql.gz | mysql -u root -p myapp 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
MySQL
MySQL is a robust relational database used from small apps to large-scale web platforms. It supports ACID transactions, replication, and extensive SQL features.
Installation
# Docker (recommended for development)
docker run -d --name mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
mysql:8
# Ubuntu/Debian
sudo apt-get install mysql-server
sudo mysql_secure_installation
# macOS
brew install mysql && brew services start mysql
# Node.js driver
npm install mysql2
# Python driver
pip install mysql-connector-python
CLI Basics
# Connect to MySQL
mysql -u root -p
# Connect to specific database
mysql -u root -p myapp
# Execute query from command line
mysql -u root -p -e "SHOW DATABASES;"
# Import SQL file
mysql -u root -p myapp < schema.sql
# Export database
mysqldump -u root -p myapp > backup.sql
Schema Design
-- schema.sql: Create tables with proper types, indexes, and constraints
CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE myapp;
CREATE TABLE users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_created (created_at)
) ENGINE=InnoDB;
CREATE TABLE orders (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL,
total_cents INT UNSIGNED NOT NULL DEFAULT 0,
status ENUM('pending','paid','shipped','completed','cancelled') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
INDEX idx_user_status (user_id, status)
) ENGINE=InnoDB;
Indexing Strategies
-- indexing.sql: Common indexing patterns for performance
-- Composite index for multi-column queries (leftmost prefix rule)
CREATE INDEX idx_orders_status_date ON orders(status, created_at);
-- Covering index — query answered entirely from index
CREATE INDEX idx_users_email_name ON users(email, name);
-- Full-text index for search
ALTER TABLE products ADD FULLTEXT INDEX ft_search (name, description);
SELECT * FROM products WHERE MATCH(name, description) AGAINST('laptop' IN BOOLEAN MODE);
-- Check query execution plan
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
Node.js with mysql2
// db.js: MySQL connection pool with mysql2 and promise API
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'root',
password: process.env.DB_PASS || 'secret',
database: 'myapp',
waitForConnections: true,
connectionLimit: 10,
charset: 'utf8mb4',
});
async function getUser(id) {
const [rows] = await pool.execute(
'SELECT id, email, name FROM users WHERE id = ?',
[id]
);
return rows[0] || null;
}
async function createOrder(userId, totalCents) {
const conn = await pool.getConnection();
try {
await conn.beginTransaction();
const [result] = await conn.execute(
'INSERT INTO orders (user_id, total_cents) VALUES (?, ?)',
[userId, totalCents]
);
await conn.commit();
return result.insertId;
} catch (err) {
await conn.rollback();
throw err;
} finally {
conn.release();
}
}
module.exports = { pool, getUser, createOrder };
Python Client
# db.py: MySQL connection with mysql-connector-python
import mysql.connector
from mysql.connector import pooling
pool = pooling.MySQLConnectionPool(
pool_name="myapp",
pool_size=5,
host="localhost",
user="root",
password="secret",
database="myapp",
charset="utf8mb4",
)
def get_user(user_id):
conn = pool.get_connection()
try:
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT id, email, name FROM users WHERE id = %s", (user_id,))
return cursor.fetchone()
finally:
conn.close()
def insert_users(users):
conn = pool.get_connection()
try:
cursor = conn.cursor()
cursor.executemany(
"INSERT INTO users (email, name, password_hash) VALUES (%s, %s, %s)",
users,
)
conn.commit()
finally:
conn.close()
Replication Setup
# my.cnf (primary): Enable binary logging for replication
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
-- replication.sql: Configure replica to follow primary
-- On primary: create replication user
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- On replica: start replication
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='primary-host',
SOURCE_USER='repl',
SOURCE_PASSWORD='repl_password',
SOURCE_AUTO_POSITION=1;
START REPLICA;
SHOW REPLICA STATUS\G
Backup and Maintenance
# backup.sh: Automated backup with compression
mysqldump -u root -p --single-transaction --routines --triggers myapp | gzip > "backup_$(date +%Y%m%d).sql.gz"
# Restore from backup
gunzip < backup_20260219.sql.gz | mysql -u root -p myapp