MySQL 命令速查
MySQL 8.0 常用命令速查:增删改查、索引、权限、锁、备份与主从
🔌 连接与库表
mysql -u root -p -h <主机> -P 3306连接数据库,回车后输密码(不写 -h 默认本机)
mysql -u root -p -h 10.0.0.5CREATE 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\GDESC <表名>;看表结构:字段名、类型、是否可空、索引
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\GInnoDB 全景:最近死锁、锁等待、缓冲池、事务
SHOW ENGINE INNODB STATUS\GSELECT * 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.sqlInnoDB 热备,不锁表(一致性快照)
mysqldump -u root -p --single-transaction shop > shop.sqlmysqldump -u root -p --all-databases --master-data=2 > all.sql全库备份并记录 binlog 位点,用于搭建从库
mysqldump -u root -p --all-databases > all.sqlmysqldump -u root -p <库> <表1> <表2> > tables.sql只备份指定表,恢复单表误删时很有用
mysqldump -u root -p shop orders > orders.sqlmysql -u root -p <库> < backup.sql恢复:导入备份文件(导入前先确认字符集)
mysql -u root -p shop < shop.sqlSHOW 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 -pSELECT @@log_bin;确认 binlog 是否开启(恢复的前提)
SELECT @@log_bin;🔁 主从复制
SHOW REPLICA STATUS\G查看复制状态(8.0.22+ 叫 REPLICA,旧版是 SLAVE STATUS)
SHOW REPLICA STATUS\GCHANGE 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 常用命令速查:库表操作、增删改查、索引优化、用户权限、锁诊断、备份恢复与主从复制。
- 按场景搜索命令
- 点击复制
- 替换库名、表名和条件
小贴士UPDATE / DELETE 一定先写 WHERE 再写 SET,大表操作前先 EXPLAIN 看一眼。
MySQL 命令速查常见问题
MySQL 命令速查是免费的吗?
完全免费,无需注册登录,也不限使用次数。997 工具箱所有工具都不收费。
使用MySQL 命令速查会把我的数据上传到服务器吗?
不会。MySQL 命令速查在浏览器本地完成计算,输入的文本和文件都不会离开你的设备,页面关闭后数据即消失。
MySQL 命令速查在手机上能用吗?
可以。页面做了移动端适配,手机和平板的浏览器打开同样能正常使用,也不需要安装任何 App。