🐬

MySQL 命令速查

MySQL 8.0 常用命令速查:增删改查、索引、权限、锁、备份与主从

🔍
68 条命令

🔌 连接与库表

mysql -u root -p -h <主机> -P 3306

连接数据库,回车后输密码(不写 -h 默认本机)

示例mysql -u root -p -h 10.0.0.5
CREATE DATABASE <库名> CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

建库,字符集必须 utf8mb4(utf8 是残缺的三字节)

示例CREATE DATABASE shop CHARACTER SET utf8mb4;
USE <库名>;

切换当前数据库

示例USE shop;
SHOW DATABASES; / SHOW TABLES;

列出所有库 / 当前库的所有表

示例SHOW TABLES;
SHOW CREATE TABLE <表名>\G

看建表语句,含字符集、索引、外键,\G 纵向显示更好读

示例SHOW CREATE TABLE orders\G
DESC <表名>;

看表结构:字段名、类型、是否可空、索引

示例DESC orders;
ALTER TABLE <表> ADD COLUMN <列> <类型> AFTER <列>;

加字段,指定位置(大表加字段要评估锁)

示例ALTER TABLE orders ADD COLUMN remark VARCHAR(200) AFTER status;
ALTER TABLE <表> MODIFY COLUMN <列> <新类型>;

改字段类型,缩长度可能截断数据

示例ALTER TABLE orders MODIFY COLUMN amount DECIMAL(12,2);
DROP TABLE <表名>; / TRUNCATE TABLE <表名>;

删表(结构一起删)/ 清空表(保留结构,不可回滚)

示例TRUNCATE TABLE logs;
SELECT VERSION(); / SELECT @@version;

查看版本,8.0 与 5.7 语法差异大,排障先确认

示例SELECT VERSION();

📝 增删改查

SELECT <列> FROM <表> WHERE <条件> ORDER BY <列> DESC LIMIT 20;

最常用查询组合:条件 + 排序 + 分页

示例SELECT id,amount FROM orders WHERE status=1 ORDER BY id DESC LIMIT 20;
SELECT COUNT(*) FROM <表> WHERE <条件>;

计数,大表全表 COUNT 很慢,尽量带索引条件

示例SELECT COUNT(*) FROM orders WHERE created_at>="2026-01-01";
INSERT INTO <表> (列1,列2) VALUES (值1,值2);

插入单行;多条用逗号拼接 VALUES 更高效

示例INSERT INTO orders (no,amount) VALUES ('A001',99.5);
INSERT INTO <表> (...) VALUES (...) ON DUPLICATE KEY UPDATE 列=值;

存在则更新,不存在则插入(依赖唯一键)

示例INSERT INTO stat (d,cnt) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE cnt=cnt+1;
UPDATE <表> SET 列=值 WHERE <条件>;

更新,**务必带 WHERE**,否则全表改

示例UPDATE orders SET status=2 WHERE id=1001;
DELETE FROM <表> WHERE <条件>;

删除行,**务必带 WHERE**;大批量删建议分批 LIMIT

示例DELETE FROM logs WHERE created_at < "2025-01-01" LIMIT 1000;
SELECT ... FROM a JOIN b ON a.id=b.a_id WHERE ...;

关联查询,JOIN 字段两边字符集/类型必须一致,否则索引失效

示例SELECT o.no,u.name FROM orders o JOIN users u ON o.user_id=u.id;
SELECT 列, COUNT(*) FROM <表> GROUP BY 列 HAVING COUNT(*)>1;

分组后过滤(WHERE 在分组前,HAVING 在分组后)

示例SELECT user_id,COUNT(*) c FROM orders GROUP BY user_id HAVING c>1;
EXPLAIN SELECT ...;

看执行计划:type/rows/Extra 是判断索引是否生效的关键

示例EXPLAIN SELECT * FROM orders WHERE no="A001";
EXPLAIN ANALYZE SELECT ...;

8.0.18+ 真正执行一次并给出实际耗时,比 EXPLAIN 准

示例EXPLAIN ANALYZE SELECT * FROM orders WHERE status=1;

⚡ 索引与优化

CREATE INDEX <索引名> ON <表>(列1,列2);

建联合索引,遵循最左前缀原则

示例CREATE INDEX idx_orders_st_ct ON orders(status,created_at);
SHOW INDEX FROM <表>;

查看表上所有索引与基数 Cardinality

示例SHOW INDEX FROM orders;
DROP INDEX <索引名> ON <表>;

删索引(8.0 也可 ALTER TABLE ... DROP INDEX)

示例DROP INDEX idx_orders_st_ct ON orders;
ALTER TABLE <表> ADD INDEX <名>(列) ALGORITHM=INPLACE, LOCK=NONE;

在线加索引,尽量不锁表(仍会短暂持元数据锁)

示例ALTER TABLE orders ADD INDEX idx_no(no), ALGORITHM=INPLACE, LOCK=NONE;
ANALYZE TABLE <表>;

重新统计索引分布,优化器选错索引时先跑这个

示例ANALYZE TABLE orders;
OPTIMIZE TABLE <表>;

整理碎片(会重建表并锁表,低峰期做)

示例OPTIMIZE TABLE logs;
SELECT * FROM sys.schema_unused_indexes;

8.0 自带:找出从没被用过的索引,可以考虑删

示例SELECT * FROM sys.schema_unused_indexes;
SET long_query_time=1; SET GLOBAL slow_query_log=ON;

开慢日志,阈值 1 秒(生产建议 0.5~2 秒)

示例SET GLOBAL slow_query_log=ON;
SHOW VARIABLES LIKE "slow_query_log%";

看慢日志是否开启及文件位置

示例SHOW VARIABLES LIKE "slow_query_log%";

🔐 用户与权限

CREATE USER '用户'@'%' IDENTIFIED BY '密码';

8.0 建用户:GRANT 不再隐式建用户,必须先 CREATE USER

示例CREATE USER 'app'@'%' IDENTIFIED BY 'Str0ng!Pass';
GRANT SELECT,INSERT,UPDATE ON <库>.* TO '用户'@'%';

授权,按最小权限原则给(别动辄 ALL PRIVILEGES)

示例GRANT SELECT,INSERT ON shop.* TO 'app'@'%';
SHOW GRANTS FOR '用户'@'%';

查看某用户的全部权限

示例SHOW GRANTS FOR 'app'@'%';
REVOKE DELETE ON <库>.* FROM '用户'@'%';

回收权限

示例REVOKE DELETE ON shop.* FROM 'app'@'%';
ALTER USER '用户'@'%' IDENTIFIED BY '新密码';

改密码(8.0 用 ALTER USER,SET PASSWORD 已废弃)

示例ALTER USER 'app'@'%' IDENTIFIED BY 'New!Pass2026';
SELECT user,host,plugin FROM mysql.user;

列出所有账号、允许来源与认证插件

示例SELECT user,host FROM mysql.user;
DROP USER '用户'@'%';

删除用户

示例DROP USER 'app'@'%';
FLUSH PRIVILEGES;

重载权限表;直接 GRANT/CREATE 通常不需要,手工改表后才用

示例FLUSH PRIVILEGES;

🩺 状态与诊断

SHOW PROCESSLIST;

看当前连接与正在执行的 SQL,加 FULL 看完整语句

示例SHOW FULL PROCESSLIST;
KILL <Id>;

杀掉卡住的查询连接(先确认不是主库关键线程)

示例KILL 12345;
SHOW STATUS LIKE 'Threads%';

看连接线程数,Threads_connected 接近 max_connections 就危险

示例SHOW STATUS LIKE 'Threads%';
SHOW VARIABLES LIKE 'max_connections';

看最大连接数上限

示例SHOW VARIABLES LIKE 'max_connections';
SHOW ENGINE INNODB STATUS\G

InnoDB 全景:最近死锁、锁等待、缓冲池、事务

示例SHOW ENGINE INNODB STATUS\G
SELECT * FROM performance_schema.data_locks;

8.0 查看当前行锁持有情况

示例SELECT * FROM performance_schema.data_locks;
SELECT * FROM performance_schema.data_lock_waits;

查看谁在等谁的锁,定位阻塞源头

示例SELECT * FROM performance_schema.data_lock_waits;
SELECT @@transaction_isolation;

看当前隔离级别(8.0 变量名,5.7 是 tx_isolation)

示例SELECT @@transaction_isolation;
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

看缓冲池大小,物理内存的 60%~70% 为宜

示例SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024) MB FROM information_schema.tables GROUP BY 1 ORDER BY 2 DESC;

统计各库占用空间,找大表

示例SELECT table_schema, ROUND(SUM(data_length)/1024/1024) MB FROM information_schema.tables GROUP BY 1;

🔒 事务与锁

START TRANSACTION; ... COMMIT;

开启事务并提交;出错用 ROLLBACK 回滚

示例START TRANSACTION; UPDATE a SET n=n-1; COMMIT;
SET autocommit=0;

关闭自动提交(默认 1,即每条语句单独成事务)

示例SET autocommit=0;
SELECT ... FOR UPDATE;

加排他锁,锁住读到行直到事务结束(悲观锁)

示例SELECT stock FROM goods WHERE id=1 FOR UPDATE;
SELECT ... LOCK IN SHARE MODE;

加共享锁,别人可读不可写(8.0 也可 FOR SHARE)

示例SELECT * FROM goods WHERE id=1 FOR SHARE;
SELECT * FROM information_schema.innodb_trx;

查看未提交的长事务,trx_started 早的就是嫌疑

示例SELECT trx_id,trx_started,trx_query FROM information_schema.innodb_trx;
SET innodb_lock_wait_timeout=10;

设置锁等待超时(默认 50 秒,太长会拖垮连接池)

示例SET innodb_lock_wait_timeout=10;
SAVEPOINT <名>; ... ROLLBACK TO <名>;

事务内设保存点,部分回滚

示例SAVEPOINT sp1;

💾 备份与恢复

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

InnoDB 热备,不锁表(一致性快照)

示例mysqldump -u root -p --single-transaction shop > shop.sql
mysqldump -u root -p --all-databases --master-data=2 > all.sql

全库备份并记录 binlog 位点,用于搭建从库

示例mysqldump -u root -p --all-databases > all.sql
mysqldump -u root -p <库> <表1> <表2> > tables.sql

只备份指定表,恢复单表误删时很有用

示例mysqldump -u root -p shop orders > orders.sql
mysql -u root -p <库> < backup.sql

恢复:导入备份文件(导入前先确认字符集)

示例mysql -u root -p shop < shop.sql
SHOW BINARY LOGS;

列出 binlog 文件,用于时间点恢复

示例SHOW BINARY LOGS;
mysqlbinlog --start-datetime="2026-09-01 10:00:00" --stop-datetime="2026-09-01 11:00:00" binlog.000123 | mysql -u root -p

按时间点恢复(误操作后最常用的一招)

示例mysqlbinlog binlog.000123 | mysql -u root -p
SELECT @@log_bin;

确认 binlog 是否开启(恢复的前提)

示例SELECT @@log_bin;

🔁 主从复制

SHOW REPLICA STATUS\G

查看复制状态(8.0.22+ 叫 REPLICA,旧版是 SLAVE STATUS)

示例SHOW REPLICA STATUS\G
CHANGE REPLICATION SOURCE TO SOURCE_HOST="主库IP", SOURCE_USER="repl", SOURCE_PASSWORD="密码", SOURCE_AUTO_POSITION=1;

GTID 模式配置主库信息(8.0.23+ 语法)

示例CHANGE REPLICATION SOURCE TO SOURCE_HOST="10.0.0.1", SOURCE_AUTO_POSITION=1;
START REPLICA; / STOP REPLICA;

启动 / 停止复制线程

示例START REPLICA;
RESET REPLICA ALL;

清除复制配置,重新搭建从库时用

示例RESET REPLICA ALL;
SHOW MASTER STATUS;

在主库看当前 binlog 文件与位点

示例SHOW MASTER STATUS;
SELECT @@gtid_mode;

确认 GTID 是否开启,开启后故障切换不用找位点

示例SELECT @@gtid_mode;
SET GLOBAL replica_parallel_workers=4;

开启并行复制缓解延迟(8.0 默认已开启)

示例SET GLOBAL replica_parallel_workers=4;

MySQL 命令速查怎么用

MySQL 8.0 常用命令速查:库表操作、增删改查、索引优化、用户权限、锁诊断、备份恢复与主从复制。

  1. 按场景搜索命令
  2. 点击复制
  3. 替换库名、表名和条件

小贴士UPDATE / DELETE 一定先写 WHERE 再写 SET,大表操作前先 EXPLAIN 看一眼。

MySQL 命令速查常见问题

MySQL 命令速查是免费的吗?

完全免费,无需注册登录,也不限使用次数。997 工具箱所有工具都不收费。

使用MySQL 命令速查会把我的数据上传到服务器吗?

不会。MySQL 命令速查在浏览器本地完成计算,输入的文本和文件都不会离开你的设备,页面关闭后数据即消失。

MySQL 命令速查在手机上能用吗?

可以。页面做了移动端适配,手机和平板的浏览器打开同样能正常使用,也不需要安装任何 App。