数据库是大型架构基石,下面我详解MySQL性能优化命令@mikechen
慢查询是性能优化的入口,几乎所有优化都从这里开始。
SHOW VARIABLESLIKE'%slow_query%'; SHOW VARIABLESLIKE'long_query_time';
开启/设置慢查询日志(常用临时开启方式)
SETGLOBAL slow_query_log=1; SETGLOBAL long_query_time=0.5;-- 单位秒,建议0.1~1秒 SETGLOBAL slow_query_log_file='/path/to/slow.log'; SETGLOBAL log_queries_not_using_indexes=1;-- 记录未走索引的查询
实时查看当前正在执行的查询(神器)
SHOW PROCESSLIST; -- 或更详细(MySQL 5.7+ / 8.0+ 推荐) SELECT*FROM performance_schema.threadsWHERE PROCESSLIST_COMMAND!='Sleep';
查看执行计划(优化 SQL 的第一步)
EXPLAINSELECT...; EXPLAINANALYZESELECT...;-- MySQL 8.0.18+ 更准确(含实际执行时间) EXPLAIN FORMAT=JSONSELECT...;-- 更详细的树状结构
InnoDB 引擎最重要的一条状态命令 sql→ 包含:锁等待、缓冲池命中率、redo log、undo log、事务、I/O、Purge 等几乎所有关键信息。
SHOWENGINEINNODBSTATUS\\G
查看全局状态值(判断命中率、压力点)
SHOWGLOBALSTATUSLIKE'Innodb_buffer_pool_%'; SHOWGLOBALSTATUSLIKE'%handler_read%';-- 看索引使用情况 SHOWGLOBALSTATUSLIKE'Created_tmp%';-- 临时表/磁盘临时表 SHOWGLOBALSTATUSLIKE'Sort%';-- 排序内存命中 SHOWGLOBALSTATUSLIKE'Qcache%';-- 查询缓存(8.0已移除)
查看当前连接数、最大连接数使用情况
SHOWGLOBALSTATUSLIKE'Threads_%'; SHOWGLOBAL VARIABLESLIKE'max_connections';
查看表索引情况 + 基数(判断索引是否有效)
SHOWINDEXFROM db.table; ANALYZETABLE db.table;-- 更新索引统计信息(很重要!)
查看表大小、碎片情况(决定是否要 OPTIMIZE)
SELECT
table_schema'数据库',
table_name'表名',
ROUND(data_length/1024/1024,2)'数据大小 MB',
ROUND(index_length/1024/1024,2)'索引大小 MB',
ROUND((data_length+index_length)/1024/1024,2)'总大小 MB'
FROM information_schema.tables
WHERE table_schema='your_db'
ORDERBY data_lengthDESC;
碎片整理(MyISAM/InnoDB 都适用)
OPTIMIZETABLE db.table_name;
查看主从复制延迟(主从环境必备)从库执行:sql重点看:Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Running
SHOW SLAVESTATUS\\G
查看当前使用的所有变量(排查配置问题)
SHOWGLOBAL VARIABLES; -- 常用过滤 SHOWGLOBAL VARIABLESLIKE'%buffer%'; SHOWGLOBAL VARIABLESLIKE'%innodb%';
查看大事务、长事务(杀掉它们)
-- MySQL 8.0+ SELECT*FROM performance_schema.data_locks; SELECT*FROM performance_schema.data_lock_waits; -- 或经典方式 SELECT*FROM information_schema.INNODB_TRXORDERBY trx_started;
杀掉指定会话(卡死、锁表时救命)
KILL12345;-- 12345 是 processlist 中的 Id
性能模式快速诊断(MySQL 5.6+ 强烈推荐)
-- 常用语句 SELECT*FROM performance_schema.events_statements_summary_by_digest ORDERBY SUM_TIMER_WAITDESCLIMIT20; -- Top 10 最耗时 SQL SELECT DIGEST_TEXT, COUNT_STAR, AVG_TIMER_WAIT/1e9'avg_ms' FROM performance_schema.events_statements_summary_by_digest ORDERBY SUM_TIMER_WAITDESCLIMIT10;