MySQL 命令速查表 - MySQL 数据库常用命令大全

面向要建库建表、优化慢查询、做备份的 MySQL 使用者。关键不在敲 CRUD,而在理解 WHERE 是否走索引、EXPLAIN 的 type 列含义、以及 DDL 与大批量操作可能锁表阻塞线上。读完能用 EXPLAIN 判断一条查询是否命中索引、定位 type=ALL 的全表扫描,安全地授予最小权限、用 mysqldump 做可恢复的备份,并理解主从复制的卡住点。

数据库·共 37 条命令·最后更新 2026-07-21
mysql数据库sql索引

典型使用场景

数据库日常运维:连接、建库建表、用户与权限管理、备份与恢复、慢查询定位,以及排查连接数耗尽、主从延迟与锁等待。

连接与用户 Connection & User 7

mysql -u root -p -h 127.0.0.1 -P 3306
交互式连接,-p 回车后输密码,-h 指定主机,-P 指定端口
mysql -u root -p db_name < dump.sql
导入 SQL 文件到指定库
mysqldump -u root -p --single-transaction db_name > backup.sql
一致性快照备份,不锁表(InnoDB)
CREATE USER 'app'@'%' IDENTIFIED BY 'password';
创建用户,'%' 允许所有主机连接,生产环境应限定 IP
GRANT SELECT, INSERT, UPDATE ON db.* TO 'app'@'%';
授予指定库的增删改查权限,最小权限原则
ALTER USER 'app'@'%' IDENTIFIED BY 'new_password';
修改用户密码,MySQL 5.7+ 语法
SHOW GRANTS FOR CURRENT_USER;
查看当前用户权限

库表操作 Database & Table 8

SHOW DATABASES;
列出所有数据库
USE db_name;
切换到指定数据库
SHOW TABLES;
列出当前库的所有表
DESC table_name;
查看表结构,等价于 SHOW COLUMNS FROM
SHOW CREATE TABLE table_name\G
查看建表语句,\G 竖排输出更易读
ALTER TABLE t ADD COLUMN col INT DEFAULT 0 AFTER id;
加列并指定位置,大表慎用(锁表)
ALTER TABLE t ADD INDEX idx_name (col);
添加索引,生产环境用 pt-online-schema-change 避免锁表
TRUNCATE TABLE t;
清空表数据保留结构,比 DELETE 快且不可回滚

查询与索引 Query & Index 6

EXPLAIN SELECT * FROM t WHERE col = 1\G
查看执行计划,关注 type/key/rows/Extra
EXPLAIN FORMAT=JSON SELECT ...
JSON 格式执行计划,信息更详细(MySQL 5.6+)
SHOW INDEX FROM t;
查看表所有索引,关注 Cardinalinality 判断选择性
SELECT COUNT(*) FROM t WHERE col IS NULL;
统计 NULL 值数量,索引不包含 NULL 行
SHOW STATUS LIKE "Slow_queries";
查看慢查询数量,需开启 slow_query_log
SHOW VARIABLES LIKE 'slow_query%';
查看慢查询日志配置

进程与锁 Process & Lock 6

SHOW PROCESSLIST;
查看所有连接和正在执行的 SQL,快速定位卡住的查询
SHOW FULL PROCESSLIST;
显示完整 SQL 语句(不截断)
KILL <id>;
终止指定连接,先确认不是主从复制线程
SELECT * FROM information_schema.INNODB_TRX;
查看当前事务,找长事务和锁等待
SELECT * FROM performance_schema.data_locks WHERE LOCK_STATUS='PENDING';
查看锁等待(MySQL 8.0+)
SHOW ENGINE INNODB STATUS\G
InnoDB 引擎状态,含死锁信息和 LATEST DETECTED DEADLOCK

备份恢复 Backup & Recovery 5

mysqldump -u root -p --all-databases --routines --triggers > all.sql
全库备份含存储过程和触发器
mysqldump -u root -p --single-transaction --master-data=2 db > db.sql
记录 binlog 位置,用于搭建从库
mysqlbinlog --start-datetime="2026-01-01 00:00:00" mysql-bin.000123 | mysql -u root -p
按时间点恢复(PITR)
mysql -u root -p -e "SET GLOBAL read_only=1;"
设只读模式,主从切换前用
SHOW BINARY LOGS;
查看 binlog 列表和大小

主从复制 Replication 5

SHOW SLAVE STATUS\G
查看从库状态(MySQL 5.7),关注 Slave_IO_Running 和 Slave_SQL_Running
SHOW REPLICA STATUS\G
查看从库状态(MySQL 8.0+ 新语法)
CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.0.0.1', SOURCE_PORT=3306;
配置主库地址(MySQL 8.0+)
START REPLICA; STOP REPLICA;
启停复制(MySQL 8.0+)
SELECT * FROM performance_schema.replication_applier_status_by_worker;
查看复制 worker 状态和错误

参数矩阵

参数作用示例
-u指定登录用户mysql -u root -p
-h指定主机地址mysql -h 127.0.0.1 -u app
-P指定端口(默认 3306)mysql -h 127.0.0.1 -P 3307
--single-transaction一致性逻辑备份(InnoDB 不锁表)mysqldump --single-transaction -u root -p db > db.sql
--master-data备份中记录 binlog 位点,便于搭建从库mysqldump --master-data=2 -u root -p db > db.sql
EXPLAIN查看查询执行计划,定位全表扫描EXPLAIN SELECT * FROM orders WHERE user_id=1;
SHOW PROCESSLIST查看当前连接与正在执行的语句SHOW PROCESSLIST;
innodb_buffer_pool_size缓冲池大小,影响命中率SET GLOBAL innodb_buffer_pool_size=2G;
slow_query_log开启慢查询日志SET GLOBAL slow_query_log=ON;
--quick流式导出,减少内存占用mysqldump --quick -u root -p db > db.sql

易错点与避坑指南

现象连接报 Too many connections。

原因max_connections 过小、连接未释放,或应用连接池配置不当。

处置SHOW PROCESSLIST 看来源;调大 max_connections;应用侧用连接池并设超时;排查慢查询占住连接。

现象UPDATE/DELETE 忘记加 WHERE,误改全表。

原因SQL 未带条件,或误在错误环境执行。

处置危险操作前先 SELECT 确认影响行数;开启 SQL_SAFE_UPDATES;先 BEGIN 再提交,确认无误再 COMMIT。

现象主从延迟持续增大。

原因从库单线程回放、大事务、或从库硬件/网络瓶颈。

处置SHOW SLAVE STATUS 看 Seconds_Behind_Master 与延迟事务;拆大事务;升级从库或多线程复制(slave_parallel_workers)。

现象查询很慢,EXPLAIN 显示 ALL(全表扫描)。

原因缺少合适索引,或查询对索引列做了函数/隐式类型转换。

处置对 WHERE/JOIN/ORDER BY 列建索引;避免 WHERE DATE(created)=... 这类索引失效写法。

现象执行 DDL(加列)时锁全表,线上卡死。

原因MySQL 5.6 之前或特定 DDL 需要锁表复制。

处置优先用 Online DDL(MySQL 8 默认);大表用 gh-ost/pt-online-schema-change 无锁变更。

现象mysqldump 备份时锁表导致写入阻塞。

原因未加 --single-transaction,对非事务表加全局读锁。

处置对 InnoDB 加 --single-transaction;仅 MyISAM 才需 --lock-all-tables,并尽量在低峰期。

排障路径

  1. 1查看实时连接与来源

    SHOW PROCESSLIST;

    定位是哪些主机/应用占满连接,区分慢查询与连接泄漏。

  2. 2定位慢查询

    SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;

    配合 slow_query_log 与 long_query_time 使用。

  3. 3查看主从复制状态

    SHOW SLAVE STATUS\G

    关注 Seconds_Behind_Master 与 Last_Error,定位延迟与中断原因。

  4. 4从备份恢复单库

    mysql -u root -p db < db.sql

    恢复前确认备份一致性;误删数据用 binlog 时间点恢复更精确。

命令示例

用 EXPLAIN 判断一条查询是否走索引

EXPLAIN SELECT * FROM orders WHERE user_id = 1001 ORDER BY created_at;

type=ref 且 key=idx_user 说明命中索引;这里 Extra 里的 Using filesort 提示 ORDER BY 未走索引,若有性能压力可在 (user_id, created_at) 上建联合索引消除排序。

输出

id  select_type  table   type  key         key_len  rows  Extra
1   SIMPLE       orders  ref   idx_user    4        3     Using index condition; Using filesort

导出并恢复一个库的备份

mysqldump -u backup -p --single-transaction --routines --triggers mydb > mydb.sql mysql -u root -p < mydb.sql

--single-transaction 用 InnoDB 事务一致性快照导出,线上导备份不加锁;恢复时直接重定向 sql 文件到 mysql 客户端执行。

查看主从复制状态

SHOW SLAVE STATUS\G

SQL 线程停住时先看 Last_SQL_Error 与 Last_Errno;若是可跳过的重复主键错误,定位后可用跳过或手动修复语句,再 START SLAVE SQL_THREAD 恢复。

输出

Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_SQL_Error: Error 'Duplicate entry' for key 'PRIMARY'
Seconds_Behind_Master: NULL

常见坑与注意事项

  • 生产环境不要直接 ALTER 大表,会锁表阻塞 DML;改用 pt-online-schema-change 或 gh-ost 做在线变更。
  • 秒杀/批量 UPDATE 或 DELETE 前先确认 WHERE 有索引,否则全表加锁范围大,容易把整个表写锁住。
  • mysqldump 全量 + binlog 增量才是完整备份策略;只定期导出 dmp 而无 binlog,误删数据后最多恢复到上次备份点。
  • 账号权限遵循最小化,别用 ALL PRIVILEGES ON *.*,更不要把 grant 权给到非管理账号。
  • Seconds_Behind_Master=0 不代表无延迟,大事务切换时可能失真,结合 relay log 落点与 Last_SQL_Error 综合判断。

提示

  • 生产环境加列加索引用 pt-online-schema-change 或 gh-ost,不要直接 ALTER 大表。
  • 看到 Seconds_Behind_Master 为 0 不代表无延迟,大事务可能导致跳变,结合 relay log 大小判断。
  • 慢查询排查先开 slow_query_log,再用 pt-query-digest 分析 TOP SQL,不要只看 EXPLAIN。

常见问题

MySQL 的 root 密码忘了,怎么优雅地重置?

先停掉 mysqld,再用 skip-grant-tables 跳过授权表启动(或在 init-file 里放一条 ALTER USER 语句让进程启动时执行),登录后用 ALTER USER 重新设密码,去掉该参数重启并使 FLUSH PRIVILEGES 生效。注意 skip-grant-tables 下服务完全没有鉴权,仅限维护窗口使用。

主键用自增 id 还是 UUID,怎么取舍?

自增主键占用小、写顺序友好,适合单库单表与日志型插入;UUID 适合需要全局唯一、多源合并或不想暴露明文整数主键时。若用 UUID 建议存二进制或转成有序 UUID,否则大表的索引空间和随机写都会膨胀。

EXPLAIN 结果里 type=ALL 是什么意思,要怎么优化?

type=ALL 表示全表扫描,通常意味着这条查询没有可用的索引,行数很多时性能极差。优化方向:为 WHERE 和 ORDER BY 涉及的列建合适的索引、用覆盖索引避免回表,必要时改写 SQL 或补 LIMIT。

用 mysqldump 备份 InnoDB 库,怎么保证一致性又不锁表?

对 InnoDB 表加 --single-transaction,用一致性快照导出,同时配 --master-data=2 记录二进制日志位点,这样备份过程几乎不阻塞写入。导出后可用 mysql < dump.sql 恢复;大库更建议用专门的逻辑备份或物理备份工具。

大表加列或改类型,为什么会让线上卡顿?

多数 ALTER 默认会重建表并持有元数据锁,处理大表时会复制数据、占用资源,可能阻塞读写并让复制滞后。现代版本可用 ALGORITHM=INPLACE 与 LOCK=NONE 尽量在线完成,但仍建议先在从库验证、挑低峰执行并评估长事务影响。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们