MySQL 在 Ubuntu 的常见性能瓶颈与定位路径
一、常见瓶颈分类
innodb_buffer_pool_size 通常设为物理内存的 40%–80%;同时关注 tmp_table_size、max_heap_table_size、sort_buffer_size、join_buffer_size 等会话级参数,避免“内存放大”。必要时用 jemalloc 替代 glibc 降低内存碎片与 RSS 占用。SHOW PROCESSLIST 可见长时间运行语句;EXPLAIN 出现 type: ALL / Using temporary / Using filesort。优化手段是建立合适索引、改写 SQL、控制返回列、定期 ANALYZE TABLE 更新统计信息。max_connections、慢查询中出现 Lock wait timeout exceeded、SHOW ENGINE INNODB STATUS 报 long semaphore wait。应对思路是优化连接池、减少长事务、拆分热点、必要时提升 max_connections 并配合线程池/限流。二、Ubuntu 环境下的典型诱因
bind-address、端口可达性、系统资源与索引设计。MaxRequestWorkers 过小、KeepAlive 配置不当,会把压力反压到 MySQL;需与 DB 协同调优。三、快速定位步骤与关键命令
top -c(按 CPU 排序)、htop、vmstat 1(关注 wa 与 cs)、nproc/free -h 了解核心数与可用内存。sudo apt install sysstat → iostat -xd 1(看 %util、r_await/w_await、aqu-sz)、iotop 定位高 I/O 进程、pidstat -d 1 关联进程 I/O、df -h / du -sh 检查空间、smartctl -a /dev/sdX 排查磁盘健康。pt-query-digest 找 Top SQL;SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; 与 SHOW STATUS LIKE 'Innodb_buffer_pool_reads';/..._read_requests; 计算缓冲池命中率;SHOW PROCESSLIST;/SHOW ENGINE INNODB STATUS\G 查锁与长事务;EXPLAIN 检查索引与执行计划;SHOW GLOBAL STATUS LIKE 'Created_tmp%tables'; 评估磁盘临时表比例。四、对症优化要点
innodb_buffer_pool_size 设为内存的 40%–80% 并持续观测命中率;合理设置 tmp_table_size/max_heap_table_size,控制会话级排序/连接缓冲,避免内存放大与 OOM;在内存碎片或 RSS 偏高时尝试 jemalloc。SELECT * 与大数据聚合;EXPLAIN 验证计划,定期 ANALYZE TABLE 更新统计信息,必要时用查询重写或物化中间结果降低 CPU。max_connections 并配合限流/队列;在 LAMP 场景联动优化 Apache MPM 与 MaxRequestWorkers 等参数,避免反向压垮数据库。