すべてのチートシート

MySQL コマンドチートシート

MySQL / MariaDB を素早く参照:クライアント コマンド、DDL / DML 文、join / 集約、インデックス、トランザクション、バックアップ / リストア — よく使うオプションと実用例をまとめました。

38 コマンド

接続

mysql -h <host> -P <port> -u <user> -p <db>

対話 MySQL クライアント セッションを開きます。

-h host; -P 3306(既定); -u user; -p password; -D db; -e cmd; -f 強制続行; --safe-updates

mysql -h mysql.internal -u app -p app_production
mysql -u root -p -e "SHOW DATABASES;"

REPL に入らずシェルから 1 つ以上の SQL を実行します。

--tee file 出力を記録; --html HTML 形式; --table タブ区切り

mysql -u root -p -e "SHOW SLAVE STATUS\G"

メタ / 情報

SHOW DATABASES

ユーザーに可視のデータベースを全て表示します。

SHOW SCHEMAS は同義

SHOW DATABASES LIKE 'app%';
SHOW TABLES / DESCRIBE

現在の DB のテーブルを一覧;単一テーブルの列を DESCRIBE。

SHOW FULL TABLES; DESCRIBE t; SHOW COLUMNS FROM t

SHOW FULL TABLES WHERE Table_type != 'BASE TABLE';
SHOW CREATE TABLE <t>

テーブルを再作成する正確な CREATE 文を出力 — マイグレーション作成に便利。

SHOW CREATE TABLE orders\G
EXPLAIN <statement>

クエリ プランとインデックス使用状況を表示。FORMAT=JSON を付けると機械可読。

EXPLAIN FORMAT=JSON; EXPLAIN ANALYZE(MySQL 8.0+)はクエリ実行も; EXTENDED / traditional は非推奨

EXPLAIN SELECT * FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 10;
SHOW STATUS / SHOW VARIABLES

サーバの健全性カウンタとチューニング可能な変数を確認。

SHOW GLOBAL STATUS LIKE 'Threads_running'; SHOW VARIABLES LIKE 'innodb_buffer_pool_size%';

SHOW GLOBAL STATUS LIKE 'Slow_queries';

データベース / スキーマ

CREATE DATABASE <db>

文字セットと照合順序を任意で指定して新規データベースを作成。

CHARACTER SET utf8mb4; COLLATE utf8mb4_0900_ai_ci; ENCRYPTION 'Y'(8.0.16+)

CREATE DATABASE app_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE <db> / DROP DATABASE <db>

デフォルト DB を切り替え、または既存 DB を削除します。

USE は直前の結果もクリアし DB を設定; DROP DATABASE は復旧不可

DROP DATABASE IF EXISTS app_old;

テーブル / DDL

CREATE TABLE

新しいテーブルを列 / キー / 既定値 / エンジン オプションで定義。

ENGINE=InnoDB; DEFAULT CHARSET=utf8mb4; AUTO_INCREMENT=<n>; KEY / UNIQUE / PRIMARY KEY 制約

CREATE TABLE orders ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT UNSIGNED NOT NULL, total DECIMAL(10,2) NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_user_created (user_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE

列 / インデックスの追加 / リネーム / 削除、エンジン変更、オプション設定。

ADD COLUMN; DROP COLUMN; MODIFY / ALTER COLUMN; ADD / DROP INDEX; RENAME; ORDER BY; ALGORITHM=INSTANT|INPLACE|COPY

ALTER TABLE orders ADD COLUMN status ENUM('pending','paid','cancelled') NOT NULL DEFAULT 'pending', ADD INDEX idx_status (status);
DROP TABLE / TRUNCATE TABLE

テーブルを削除(CASCADE 任意)、または高速に空にする(AUTO_INCREMENT もリセット)。

DROP TABLE IF EXISTS; TRUNCATE TABLE; FOREIGN_KEY_CHECKS=0 でテーブル間操作を許可

TRUNCATE TABLE staging.events;
RENAME TABLE <a> TO <b>

アトミックなリネーム — シャドウ テーブルを使ったホット スワップに便利。

RENAME TABLE orders TO orders_old, orders_new TO orders;

DML

INSERT INTO <t> [(cols)] VALUES ...

1 行以上を挿入;複数行 INSERT は単発 INSERT 多数より高速。

INSERT IGNORE; ON DUPLICATE KEY UPDATE(upsert); INSERT ... SELECT; LAST_INSERT_ID()

INSERT INTO orders(user_id, total) VALUES (1, 9.99), (1, 4.50), (2, 19.95);
INSERT ... ON DUPLICATE KEY UPDATE

Upsert — 一意 / 主キーが衝突したら更新、影響行は 2 を返します。

VALUES(col) で新旧参照; LAST_INSERT_ID() で auto-increment 連鎖

INSERT INTO counters(id, hits) VALUES (1, 1) ON DUPLICATE KEY UPDATE hits = hits + 1
REPLACE INTO ...

一意キー衝突時に delete + insert を行う短縮記法(非推奨パターン)。

REPLACE INTO settings(k, v) VALUES ('theme', 'dark')
UPDATE / DELETE

行の変更 / 削除。WHERE がない場合テーブル全体に影響します。

UPDATE ... ORDER BY ... LIMIT n; 複数テーブル UPDATE t1, t2 SET ... WHERE ...; ON DELETE CASCADE

UPDATE orders SET status='paid' WHERE user_id = 42 AND status='pending' ORDER BY created_at LIMIT 100;
DELETE ... ORDER BY ... LIMIT N

大量行を少しずつ削除し、undo ログとロック時間を抑えます。

LIMIT N; ループして繰り返し; 全件は TRUNCATE 検討

DELETE FROM events WHERE created_at < now() - INTERVAL 30 DAY ORDER BY id LIMIT 5000

クエリ / フィルタ

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... OFFSET ...

フィルタ、ソート、ページネーションを付けて行を読み取り。

DISTINCT; IN (subquery) / ANY / ALL; BETWEEN; IS NULL; REGEXP; STRAIGHT_JOIN ヒント

SELECT id, status FROM orders WHERE user_id = 42 AND status IN ('paid','shipped') ORDER BY created_at DESC LIMIT 10 OFFSET 20;
GROUP BY ... HAVING ...

行を集約し、その結果に対してフィルタを適用します。

sql_mode=ONLY_FULL_GROUP_BY(8.0+); WITH ROLLUP で総合計行を追加

SELECT user_id, count(*) AS n, sum(total) AS gmv FROM orders GROUP BY user_id HAVING count(*) >= 3 ORDER BY gmv DESC LIMIT 50;

結合

[INNER | LEFT | RIGHT | CROSS] JOIN ... ON ...

複数テーブルの行を組合せます。

STRAIGHT_JOIN; USING(col); MySQL 8.0+ のみ nested-loop / hash; JSON_TABLE

SELECT u.email, count(o.id) FROM users u LEFT JOIN orders o ON o.user_id = u.id GROUP BY u.email ORDER BY count(o.id) DESC;
WITH cte AS (...) SELECT ...

共通テーブル式 — 8.0 以降は再帰も対応。

WITH RECURSIVE org AS (SELECT id, manager_id, name FROM staff WHERE manager_id IS NULL UNION ALL SELECT s.id, s.manager_id, s.name FROM staff s JOIN org o ON s.manager_id = o.id) SELECT * FROM org;

集約

COUNT() / SUM() / AVG() / MIN() / MAX() / GROUP_CONCAT()

組み込みの集約関数。

COUNT(DISTINCT x); GROUP_CONCAT(col ORDER BY col SEPARATOR ',')

SELECT day(created_at) AS d, sum(total) AS gmv, count(*) AS n FROM orders GROUP BY day(created_at) ORDER BY d DESC LIMIT 7;

インデックス / ビュー

CREATE INDEX ...

ルックアップと ORDER BY を高速化するセカンダリ インデックスを追加。

UNIQUE; FULLTEXT / SPATIAL(エンジン依存); 複合は ON tbl(col, ...); INVISIBLE フラグ(8.0+); キー列に DESC

CREATE INDEX idx_user_created ON orders(user_id, created_at DESC) ALGORITHM=INPLACE LOCK=NONE;
DROP INDEX / ALTER TABLE ... DROP INDEX

インデックスを削除。ALTER TABLE なら追加と削除を 1 文にまとめられます。

ALTER TABLE orders DROP INDEX idx_user_created;
CREATE VIEW / CREATE OR REPLACE VIEW

SELECT を保存;更新可能ビューは制限付きで INSERT / UPDATE / DELETE が可能。

CREATE OR REPLACE; WITH CHECK OPTION で書き込み時の WHERE 強制; ALGORITHM=MERGE|TEMPTABLE

CREATE OR REPLACE ALGORITHM=MERGE SQL SECURITY INVOKER VIEW v_user_orders AS SELECT user_id, count(*) AS n FROM orders GROUP BY user_id;

トランザクション

START TRANSACTION / COMMIT / ROLLBACK

文を ACID 単位にラップ;既定は autocommit(単発文には Tx 不要)。

START TRANSACTION WITH CONSISTENT SNAPSHOT; COMMIT; ROLLBACK TO SAVEPOINT

START TRANSACTION; UPDATE ...; ROLLBACK;
SET autocommit = 0; SET TRANSACTION ISOLATION LEVEL ...

文単位 autocommit を無効化し分離レベルを変更:REPEATABLE READ(InnoDB 既定)、READ COMMITTED、READ UNCOMMITTED、SERIALIZABLE。

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SET autocommit = 0;
SELECT ... FOR UPDATE / LOCK IN SHARE MODE

同時実行下での安全性を確保する行レベル ロック。NOWAIT / SKIP LOCKED は 8.0+ で利用可。

FOR UPDATE NOWAIT / SKIP LOCKED

SELECT id FROM jobs WHERE status='queued' ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED;

バックアップ / リストア

mysqldump -u <user> -p <db> > dump.sql

論理バックアップ:SQL INSERT / DDL をファイルに出力。

--single-transaction で InnoDB 用; --routines; --triggers; --no-data スキーマのみ; --add-drop-table; --column-statistics=0

mysqldump -u root -p --single-transaction --routines --triggers --events app > /backup/app-$(date +%F).sql
mysql -u root -p <db> < dump.sql

SQL ダンプを(ターゲット)データベースへリプレイします。

--force; --auto-rehash; --comments

mysql -u root -p app_new < /backup/app.sql
SOURCE /path/script.sql

REPL 内から SQL スクリプトを実行します。

最終文の終端記号(source の場合)や \.(CLI)は不要

SOURCE /tmp/migrations/0002_add_index.sql;
mysqlbinlog binlog.000001 > incr.sql

バイナリ ログを SQL に変換し、ポイント イン タイム リカバリに利用。

--start-datetime; --stop-datetime; --start-position; --stop-position

mysqlbinlog --start-datetime='2026-07-23 00:00:00' /var/lib/mysql/binlog.000123 > /inc.sql

ユーザ / 権限

CREATE USER / ALTER USER / DROP USER

MySQL アカウントを管理します。

IDENTIFIED BY '...'; IDENTIFIED WITH caching_sha2_password; WITH MAX_CONNECTIONS 10;

CREATE USER 'reporting'@'%' IDENTIFIED BY 'P@ssw0rd!'; ALTER USER 'app'@'%' PASSWORD EXPIRE NEVER;
GRANT / REVOKE

オブジェクト権限とグローバル権限;組合せで実効権限が決まります。

GRANT SELECT ON app.* TO 'reporting'@'%'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

GRANT SELECT, INSERT, UPDATE, DELETE ON app.* TO 'app'@'%';
FLUSH PRIVILEGES

手動変更後にメモリ上の権限テーブルを再読み込み(GRANT 文の後は不要)。

FLUSH HOSTS / LOGS / TABLES

FLUSH PRIVILEGES;

診断

SHOW PROCESSLIST / KILL <id>

実行中のスレッドを表示;長時間 / 停止したクエリを KILL。

SHOW FULL PROCESSLIST で完全な SQL; KILL CONNECTION はクライアント切断; KILL QUERY はクエリのみ停止

SHOW FULL PROCESSLIST\G; KILL 12345;
SHOW ENGINE INNODB STATUS\G

InnoDB の詳細診断:ロック、トランザクション、バッファ プール、履歴。

PERFORMANCE_SCHEMA クエリ:SELECT * FROM performance_schema.events_statements_summary_by_digest_by_error;

SHOW ENGINE INNODB STATUS\G

チートシート バージョン 1.0.0

MySQL 8.0+ に対応