温馨提示×

ubuntu mysql怎么优化速度

小樊
41
2026-08-11 11:44:28
栏目: 云计算

Ubuntu 上优化 MySQL 速度,可以从 系统、MySQL 配置、表结构、SQL、硬件 几个方面来做。下面给你一套实战型优化清单,按优先级排序,适合大多数场景(Web / 后台服务)。


一、先确认瓶颈在哪(很重要)

不要一上来就乱改参数。

top
htop
iotop
SHOW PROCESSLIST;
SHOW ENGINE INNODB STATUS\G
mysqltuner

✅ 先判断是:

  • CPU 高
  • IO 高
  • 锁等待
  • 慢查询

二、MySQL 核心配置文件(重点)

配置文件路径:

/etc/mysql/mysql.conf.d/mysqld.cnf

1️⃣ 基础优化(强烈推荐)

[mysqld]
innodb_buffer_pool_size = 60% ~ 70% 内存
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

示例(4G 内存服务器):

innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M

⚠️ 修改后重启 MySQL

sudo systemctl restart mysql

2️⃣ 连接与线程优化

max_connections = 300
thread_cache_size = 16
table_open_cache = 2000

三、慢查询优化(提升最明显)

1️⃣ 开启慢查询日志

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
sudo systemctl restart mysql

分析慢查询:

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

2️⃣ 加索引(90% 慢查询原因)

EXPLAIN SELECT * FROM orders WHERE user_id = 10;

✅ 建索引原则:

  • WHERE / JOIN / ORDER BY 用到的字段
  • 联合索引顺序要一致
  • 不要给低区分度字段建索引(如 gender)
CREATE INDEX idx_user_status ON orders(user_id, status);

四、InnoDB 专项优化(Ubuntu 默认引擎)

innodb_file_per_table = ON
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8

✅ SSD 服务器建议开启


五、SQL 写法优化(非常重要)

❌ 错误示范:

SELECT * FROM orders WHERE DATE(created_at) = '2024-01-01';

✅ 优化后:

SELECT * FROM orders
WHERE created_at >= '2024-01-01'
AND created_at < '2024-01-02';

❌ 避免:

  • SELECT *
  • LIKE '%keyword%'
  • 大分页 LIMIT 100000, 20

✅ 正确分页:

SELECT * FROM orders WHERE id > 100000 ORDER BY id LIMIT 20;

六、Ubuntu 系统层优化

1️⃣ 关闭 swap(有内存时)

sudo swapoff -a

2️⃣ 文件系统

  • 使用 ext4xfs
  • 挂载参数:
noatime,nodiratime

3️⃣ 内存建议

内存 innodb_buffer_pool_size
2G 1G
4G 2.5G
8G 5G
16G 10G

七、定期维护

OPTIMIZE TABLE table_name;
ANALYZE TABLE table_name;

清理 binlog(防止磁盘爆):

expire_logs_days = 7

八、高频场景速查表

场景 优化方式
查询慢 加索引 + EXPLAIN
写入慢 调大 innodb_log_file_size
并发高 调大 max_connections
磁盘 IO 高 innodb_io_capacity
内存不足 减小 buffer_pool

九、如果你愿意,我可以帮你:

  • ✅ 分析 具体慢 SQL
  • ✅ 根据你的 内存 / 业务 给出 最优 my.cnf
  • ✅ 判断是 MySQL 问题还是程序问题

你可以直接告诉我:

Ubuntu 版本 + MySQL 版本 + 内存 + 当前慢查询

0