全部速查表

MySQL 命令速查

MySQL / MariaDB 快速参考:客户端命令、DDL/DML、连接与聚合、索引、事务与备份恢复,并附带常用参数和实操示例。

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 file 输出到文件;--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>

打印出能完整重建该表的语句——迁移场景下很方便。

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 会清空上一次结果并设置当前库;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 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——遇到唯一键冲突时改为更新;affected-rows 返回 2。

VALUES(col) 取得旧值/新值;LAST_INSERT_ID() 技巧实现自增链式递增

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 log 与锁持续时间。

LIMIT N;循环 REPEAT;整表清理考虑直接 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);nested-loop/hash 仅 MySQL 8.0+;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 ...

公共表表达式(CTE)——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 仅 schema;--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

把 binlog 转换为 SQL,用于 PITR(时间点恢复)。

--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 表(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、历史信息。

PERFORMANCE_SCHEMA 查询示例:SELECT * FROM performance_schema.events_statements_summary_by_digest_by_error;

SHOW ENGINE INNODB STATUS\G

速查页版本 1.0.0

适用于 MySQL 8.0+