优化 Debian 上的 MySQL(或 MariaDB)性能,通常需要从系统层面、MySQL 配置、Schema 与查询、监控四个方面入手。下面给你一套比较实用的优化思路,适合生产环境也适合学习参考。
推荐:
ext4 或 xfs/dev/sda1 /var/lib/mysql ext4 defaults,noatime,nodiratime,barrier=0 0 2
noatime可减少磁盘写操作
编辑 /etc/sysctl.conf:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
应用:
sysctl -p
MySQL 对磁盘 I/O 非常敏感,尽量:
假设服务器有 8GB 内存:
[mysqld]
innodb_buffer_pool_size = 4G # 约为物理内存的 50%~70%
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2 # 性能优先(可接受少量丢数据)
sync_binlog = 0
max_connections = 200
thread_cache_size = 16
MySQL 8.0 已移除查询缓存
query_cache_type = 0
query_cache_size = 0
table_open_cache = 2000
innodb_file_per_table = 1
innodb_io_capacity = 2000 # SSD 可设更高
innodb_flush_method = O_DIRECT
innodb_buffer_pool_instances = 4
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
分析:
mysqldumpslow -s t /var/log/mysql/slow.log
EXPLAIN SELECT * FROM orders WHERE user_id = 10;
关注:
type(至少 ref)rowsUsing filesort / Using temporarySELECT *Debian 自带版本可能较旧:
apt install mariadb-server
systemctl edit mysql
[Service]
MemoryLimit=6G
htopiostat -x 1mysqladmin statuspt-query-digest[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
max_connections = 200
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置文件。