连接
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_productionmysql -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\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';数据库与 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 UPDATEUpsert——遇到唯一键冲突时改为更新;affected-rows 返回 2。
VALUES(col) 取得旧值/新值;LAST_INSERT_ID() 技巧实现自增链式递增
INSERT INTO counters(id, hits) VALUES (1, 1) ON DUPLICATE KEY UPDATE hits = hits + 1REPLACE 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).sqlmysql -u root -p <db> < dump.sql把 SQL 转储回放到(目标)数据库。
--force;--auto-rehash;--comments
mysql -u root -p app_new < /backup/app.sqlSOURCE /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\GInnoDB 的详细诊断信息:锁、事务、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+