温馨提示×

ubuntu mysql为何慢查询

小樊
42
2026-10-27 14:55:31
栏目: 云计算

在 Ubuntu 上 MySQL 出现慢查询(Slow Query),通常不是单一原因,而是多种因素叠加。下面从常见原因 → 排查方法 → 优化建议系统说明。


一、常见导致 MySQL 慢查询的原因

1️⃣ 没有合理使用索引

这是最常见原因。

  • WHERE 条件字段无索引
  • 使用了 LIKE '%xxx%'
  • 对索引字段做函数运算(如 DATE(create_time))
  • 隐式类型转换(如字符串字段用数字查)

✅ 表现:

SELECT * FROM user WHERE name LIKE '%tom%';

2️⃣ 查询返回数据量过大

  • SELECT *
  • 没有分页(LIMIT)
  • 一次查几十万行

3️⃣ 表结构设计不合理

  • 大字段(TEXT / BLOB)频繁查询
  • 表没有主键
  • 单表数据量过大(千万级未分表)

4️⃣ SQL 写法问题

  • 子查询性能差
  • JOIN 多张表但无索引
  • ORDER BY / GROUP BY 无法走索引

5️⃣ MySQL 配置不当(Ubuntu 常见问题)

常见参数不合理:

innodb_buffer_pool_size  # 太小(默认可能只有 128M)
max_connections          # 太小,导致排队
query_cache_type         # MySQL 8 已移除
tmp_table_size
sort_buffer_size

6️⃣ 服务器资源瓶颈

  • CPU 100%
  • 内存不足 → 频繁 swap
  • 磁盘 IO 慢(云服务器常见)
  • Ubuntu 使用 HDD 而非 SSD

7️⃣ 锁等待 / 并发问题

  • 行锁 / 表锁
  • 长事务未提交
  • 写操作阻塞读

8️⃣ Ubuntu 特有因素

  • 默认 MySQL 配置保守
  • 云服务器 IOPS 限制
  • AppArmor / 磁盘挂载方式影响 IO

二、如何快速定位慢查询(重点)

✅ 1. 开启慢查询日志

SHOW VARIABLES LIKE 'slow_query_log';

开启:

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

Ubuntu 日志位置:

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

✅ 2. 用 EXPLAIN 分析 SQL

EXPLAIN SELECT * FROM orders WHERE user_id = 10;

重点看:

  • type(ALL = 全表扫描 ❌)
  • key(是否用到索引)
  • rows(扫描行数)

✅ 3. 查看实时慢查询

SHOW PROCESSLIST;

或:

mysqladmin processlist

✅ 4. 使用性能分析工具

pt-query-digest /var/log/mysql/mysql-slow.log

三、Ubuntu 下常用优化建议

✅ 1. 调整 InnoDB 内存

innodb_buffer_pool_size = 1G  # 物理内存的 60~70%

✅ 2. 加索引(最关键)

ALTER TABLE user ADD INDEX idx_name (name);

✅ 3. 避免 SELECT *

SELECT id, name FROM user;

✅ 4. 控制返回行数

LIMIT 20 OFFSET 0;

✅ 5. 升级磁盘 / 使用 SSD

云服务器尤其重要。


四、如果你愿意,我可以更进一步帮你

你可以直接贴出:

  1. 慢查询 SQL
  2. EXPLAIN 结果
  3. 表结构(SHOW CREATE TABLE)
  4. MySQL 版本(mysql -V)
  5. Ubuntu 版本

我可以精准告诉你哪一句慢、为什么慢、怎么改最快 ✅

0 踩