温馨提示×

如何进行Linux MariaDB性能调优

小樊
49
2026-06-30 14:55:33
栏目: 云计算

Linux 下 MariaDB 性能调优通常从 硬件/OS、MariaDB 参数、表结构/SQL、监控与维护 四个层面进行。下面是一套实用、可操作的调优思路。


一、系统层(OS & 硬件)

1. 内存与 CPU

  • 尽量 把内存留给 InnoDB Buffer Pool
  • 避免使用 swap(除非必要)
vm.swappiness = 1

2. 磁盘

  • SSD 对数据库提升非常明显
  • 文件系统推荐:XFS / ext4(禁用 atime)
mount -o noatime,nodiratime /dev/sdb /var/lib/mysql

3. 文件描述符

ulimit -n

建议:

/etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535

二、MariaDB 核心参数调优(重点)

配置文件一般在:

/etc/my.cnf
或
/etc/mysql/my.cnf

1. InnoDB(最重要)

[mysqld]
innodb_buffer_pool_size = 60%~70% 内存
innodb_buffer_pool_instances = 4~16
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

说明:

参数 建议
buffer_pool_size 越大越好(但别超内存)
log_file_size 减少 checkpoint
flush_log_at_trx_commit 2 性能高,1 最安全
O_DIRECT 避免双缓存

2. 连接与线程

max_connections = 200~500
thread_cache_size = 50
table_open_cache = 4000

避免:

  • max_connections 设置过大(会吃内存)

3. 查询缓存(慎用)

MariaDB 10.6+ 不推荐

query_cache_type = 0
query_cache_size = 0

4. 临时表与排序

tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
join_buffer_size = 4M

⚠️ 不要盲目调大,否则并发高时内存爆炸。


三、表结构与 SQL 优化

1. 索引优化(最重要)

  • 避免全表扫描
  • WHERE / JOIN / ORDER BY 字段加索引
  • 联合索引注意顺序
EXPLAIN SELECT ...

重点关注:

  • type = ALL(危险)
  • rows 很大

2. 表设计

  • 使用 InnoDB
  • 主键尽量短、递增
  • 避免 TEXT / BLOB 滥用
  • 不要过度分表

3. 常见 SQL 陷阱

SELECT *

WHERE DATE(create_time) = '2024-01-01'

WHERE create_time >= '2024-01-01'
AND create_time < '2024-01-02'

四、监控与诊断工具

1. 查看运行状态

SHOW GLOBAL STATUS;
SHOW ENGINE INNODB STATUS\G

2. 慢查询日志(强烈推荐)

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

分析:

mysqldumpslow slow.log

3. 第三方工具

  • pt-query-digest
  • mytop
  • innotop
  • Prometheus + Grafana(生产环境)

五、日常维护

  • 定期 ANALYZE TABLE
  • 定期清理无用索引
  • 控制事务大小
  • 避免长事务

六、典型场景建议

读多写少

  • 增大 buffer pool
  • 从库做读写分离

写多

  • 减小事务提交频率
  • 批量插入
  • 调整 redo log 大小

七、快速检查清单(实战)

✅ 内存是否够
✅ buffer_pool_size 是否合理
✅ 是否存在全表扫描
✅ 是否开启慢查询
✅ 磁盘 IO 是否瓶颈


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

  • MariaDB 版本
  • 内存大小
  • 主要业务(读多 / 写多 / 混合)
  • 当前 my.cnf

我可以 直接帮你给出一份定制化的调优配置

0