下面从系统层、MariaDB 配置层、SQL 与索引、监控与维护四个维度,给你一份在 Ubuntu + MariaDB 上比较实用的优化指南(适用于 10.3+,也适合 MySQL 思路)。
ext4 或 xfsdefaults,noatime,nodiratime,barrier=0
(生产环境谨慎关闭 barrier)
# 提高文件句柄
fs.file-max = 1000000
# TCP 优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
sysctl vm.swappiness=10
对数据库性能提升最大。
配置文件位置:
/etc/mysql/mariadb.conf.d/50-server.cnf
假设 服务器 8G 内存,专用数据库
innodb_buffer_pool_size = 5G
innodb_buffer_pool_instances = 5
经验:
buffer_pool ≈ 70%~80% 内存innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
trx_commit=2提高性能,但崩溃可能丢 1 秒数据(看业务)
max_connections = 500
thread_cache_size = 100
避免:
max_connections = 2000 # 没内存直接崩
query_cache_type = 0
(高并发几乎必关)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
分析:
mysqldumpslow -s t /var/log/mysql/slow.log
-- 错误
WHERE DATE(create_time) = '2024-01-01'
-- 正确
WHERE create_time >= '2024-01-01'
SELECT id, name FROM user;
EXPLAIN SELECT * FROM orders WHERE user_id = 10;
关注:
OPTIMIZE TABLE table_name;
(InnoDB 可定期做)
ANALYZE TABLE table_name;
htopiotopmytoppt-query-digestPrometheus + Grafana| 现象 | 可能原因 |
|---|---|
| CPU 高 | 慢 SQL / 缺索引 |
| IO 高 | buffer pool 小 |
| 连接爆 | max_connections 低 |
| 写慢 | 刷盘策略 / 磁盘差 |
my.cnf你可以直接贴:
Ubuntu 版本 + MariaDB 版本 + 内存 + 业务类型