温馨提示×

ubuntu mysql为何慢查询多

小樊
44
2026-09-25 08:39:48
栏目: 云计算

在 Ubuntu 上 MySQL 慢查询变多,通常不是“Ubuntu 本身”的问题,而是系统环境 + MySQL 配置 + 业务 SQL共同作用的结果。下面按「常见原因 → 排查方法 → 解决建议」给你梳理。


一、最常见原因(按出现频率)

1️⃣ 慢查询日志没开 / 阈值不合理

  • 默认 long_query_time=10s,很多“慢”其实在 1~3 秒,不会被记录
  • 你以为“慢查询多”,其实是日志刚开

检查:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

建议:

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;

2️⃣ 索引缺失或失效(最常见)

  • 没有索引
  • 用了 LIKE '%xx'
  • 对索引列做函数运算
  • 隐式类型转换

排查:

EXPLAIN SELECT ...;

典型问题:

WHERE DATE(create_time) = '2024-01-01'
WHERE phone = 13800000000  -- phone 是 varchar

3️⃣ Ubuntu 服务器资源不足

常见表现:

  • CPU 100%
  • 内存不够,频繁 swap
  • 磁盘 IO 高

查看:

top
free -h
iostat -x 1

典型问题:

  • 小内存机器跑大 MySQL
  • 云服务器 IO 限制(尤其是低配云盘)

4️⃣ MySQL 配置不合理(Ubuntu 默认很保守)

Ubuntu 默认 my.cnf 偏小:

常见问题:

  • innodb_buffer_pool_size 太小
  • max_connections 太低
  • 没开查询缓存(MySQL 8 已移除)

查看:

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

建议(示例):

[mysqld]
innodb_buffer_pool_size = 1G  # 物理内存的 50%~70%
max_connections = 200

5️⃣ 并发突然变高

  • 定时任务集中执行
  • 爬虫 / 接口被刷
  • 批量任务没限速

查看:

SHOW PROCESSLIST;

6️⃣ 表数据量变大但未优化

  • 千万级表没分区
  • 没归档历史数据
  • 索引碎片严重

优化:

OPTIMIZE TABLE table_name;

7️⃣ Ubuntu 系统层问题(较少但存在)

  • 使用了 慢磁盘(HDD / 低性能云盘)
  • 文件系统不是 ext4 / xfs
  • 开了 swap 且频繁使用

二、快速定位“是谁慢”

1️⃣ 看慢查询日志

cat /var/log/mysql/mysql-slow.log

2️⃣ 按 SQL 聚合(推荐)

mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log

3️⃣ 实时看卡在哪

SHOW PROCESSLIST;

三、建议你现在做的 5 件事

  1. 开启慢查询日志(long_query_time=1)
  2. 用 EXPLAIN 分析 Top 慢 SQL
  3. 检查 innodb_buffer_pool_size
  4. 看服务器 CPU / 内存 / IO
  5. 把慢 SQL 贴出来我可以帮你直接优化

如果你愿意,可以告诉我:

  • MySQL 版本
  • 服务器配置(CPU / 内存)
  • 一张典型慢表结构
  • 一条慢 SQL

我可以直接帮你定位并给优化方案。

0 踩