首先通过Linux系统工具监控底层资源使用情况,快速判断瓶颈所在层(CPU、内存、磁盘、网络)。常用命令:
top/htop:查看mysqld进程的CPU、内存占用率;若CPU占用持续高位,可能是查询计算密集或锁竞争;内存占用过高可能提示缓冲池配置不合理。vmstat 1:关注us(用户进程CPU占比)、sy(系统进程CPU占比)、free(空闲内存)、buff(缓冲区内存);us过高可能是SQL计算量大,free过低可能内存不足。iostat -x 1:查看await(磁盘IO平均等待时间)、%util(磁盘利用率);%util接近100%说明磁盘IO瓶颈,需优化IO密集型查询或升级SSD。netstat -antp:监控网络流量,若带宽占用过高可能影响远程数据库访问。通过MySQL内置命令获取数据库运行时的详细指标,定位具体问题:
SHOW GLOBAL STATUS:查看关键状态变量(如Queries(总查询数)、Slow_queries(慢查询数)、Threads_running(活跃线程数)、Innodb_buffer_pool_reads(缓冲池未命中数));Slow_queries增长快说明慢查询多,Innodb_buffer_pool_reads高说明缓冲池不够大。SHOW PROCESSLIST:查看当前所有连接的SQL语句;若大量线程处于Sending data、Copying to tmp table状态,可能是查询未走索引或排序/分组操作过多。SHOW ENGINE INNODB STATUS:查看InnoDB引擎状态(如锁等待、死锁、缓冲池命中率);锁等待多可能提示事务设计不合理。慢查询日志是排查性能瓶颈的核心工具,记录执行时间超过阈值的SQL语句。配置与分析步骤:
my.cnf中添加:[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 1 # 设置慢查询阈值为1秒(根据业务调整)
mysqldumpslow或pt-query-digest工具汇总慢查询;例如:mysqldumpslow -s r -t 10 /var/log/mysql/slow-query.log # 显示执行时间最长的10条SQL
重点关注SELECT *(全表扫描)、未走索引的WHERE条件、复杂JOIN或子查询。使用EXPLAIN命令分析慢查询的执行计划,识别索引使用问题:
type:访问类型(ALL为全表扫描,index为索引扫描,range为范围扫描,ref/eq_ref为最优索引使用);key:使用的索引(若为NULL,说明未走索引);rows:预估扫描行数(数值越大,效率越低);Extra:额外信息(如Using filesort(排序未走索引)、Using temporary(临时表)需警惕)。WHERE、JOIN、ORDER BY字段添加合适索引,避免SELECT *,拆分复杂查询。MySQL默认配置不适合生产环境,需根据硬件资源和业务特点调整关键参数:
innodb_buffer_pool_size:InnoDB缓冲池大小(建议设置为物理内存的50%-70%,用于缓存数据和索引,减少磁盘IO);max_connections:最大连接数(根据并发请求量调整,避免过多连接导致内存耗尽);query_cache_size:查询缓存大小(MySQL 8.0+已移除,旧版本需根据查询重复率设置,避免缓存失效频繁);innodb_log_file_size:redo log文件大小(建议设置为256M-2G,提升事务写入性能)。锁竞争和死锁会导致线程阻塞,降低并发性能:
SHOW ENGINE INNODB STATUS中的TRANSACTIONS部分,查看Waiting for table metadata lock(元数据锁)或lock_mode X locks rec but not gap(行锁);SHOW ENGINE INNODB STATUS中的LATEST DETECTED DEADLOCK部分,查看死锁发生的SQL语句;READ COMMITTED替代REPEATABLE READ)、避免在事务中执行耗时操作。通过以上路径逐步排查,可从系统底层到数据库内部精准定位MySQL性能瓶颈,并针对性优化。需注意,性能优化是持续过程,需结合业务变化定期复查。