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_productionmysql -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\GEXPLAIN <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 UPDATEUpsert — 一意 / 主キーが衝突したら更新、影響行は 2 を返します。
VALUES(col) で新旧参照; LAST_INSERT_ID() で auto-increment 連鎖
INSERT INTO counters(id, hits) VALUES (1, 1) ON DUPLICATE KEY UPDATE hits = hits + 1REPLACE 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 VIEWSELECT を保存;更新可能ビューは制限付きで 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).sqlmysql -u root -p <db> < dump.sqlSQL ダンプを(ターゲット)データベースへリプレイします。
--force; --auto-rehash; --comments
mysql -u root -p app_new < /backup/app.sqlSOURCE /path/script.sqlREPL 内から 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 USERMySQL アカウントを管理します。
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\GInnoDB の詳細診断:ロック、トランザクション、バッファ プール、履歴。
PERFORMANCE_SCHEMA クエリ:SELECT * FROM performance_schema.events_statements_summary_by_digest_by_error;
SHOW ENGINE INNODB STATUS\Gチートシート バージョン 1.0.0
MySQL 8.0+ に対応