全部速查表

MySQL 命令速查

MySQL/MariaDB 快速參考:客戶端指令、DDL/DML 陳述式、join/彙總、索引、交易與備份/還原——附常用參數與實作範例。

38 條命令

連線

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

開啟互動式 MySQL 用戶端工作階段。

-h 主機;-P 預設 3306;-u 使用者;-p 密碼;-D 資料庫;-e 命令;-f 強制繼續;--safe-updates

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

在 shell 中直接執行一條或多條 SQL,不必進入 REPL。

--tee 檔案 擷取輸出;--html HTML 格式;--table Tab 分隔

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

中繼資料與資訊

SHOW DATABASES

列出使用者可見的所有資料庫。

SHOW SCHEMAS 為同義詞

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

列出當前資料庫的資料表;DESCRIBE 顯示單一資料表的欄位。

SHOW FULL TABLES;DESCRIBE t;SHOW COLUMNS FROM t

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

輸出能重建該資料表的完整 SQL——遷移時很好用。

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';

資料庫與 Schema

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>

切換預設資料庫,或刪除既有資料庫。

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 ...

插入一筆或多筆資料;多筆 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 ...

唯一鍵衝突時等同刪除後再插入的速記(已不建議的模式)。

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 (子查詢) / 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 join;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 ...

Common Table Expression——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 可一次新增與刪除。

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(單陳述式不必包交易)。

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

並發情境下用列級鎖定保護資料。8.0+ 提供 NOWAIT/SKIP LOCKED。

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 dump 重放到目標資料庫。

--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

把 binary log 轉成 SQL,用於 point-in-time recovery。

--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 診斷資訊:鎖、交易、buffer pool、history。

PERFORMANCE_SCHEMA 查詢:SELECT * FROM performance_schema.events_statements_summary_by_digest_by_error;

SHOW ENGINE INNODB STATUS\G

速查頁版本 1.0.0

適用於 MySQL 8.0+