MySQL运行时的性能与配置参数有着密切的联系,为了保证我们的MySQL服务高效,就必须对各项参数进行优化。

MariaDB提供了多个适合不同规模的配置文件供选择和参考,位于/usr/share/mysql

[root@localhost ~]# ls /usr/share/mysql/my-*.cnf -l

-rw-r--r--. 1 root root 4920 5月 2 01:18 /usr/share/mysql/my-huge.cnf

-rw-r--r--. 1 root root 20441 5月 2 01:18 /usr/share/mysql/my-innodb-heavy-4G.cnf

-rw-r--r--. 1 root root 4907 5月 2 01:18 /usr/share/mysql/my-large.cnf

-rw-r--r--. 1 root root 4920 5月 2 01:18 /usr/share/mysql/my-medium.cnf

-rw-r--r--. 1 root root 2846 5月 2 01:18 /usr/share/mysql/my-small.cnf

[root@localhost ~]#

1. 内存配置参数

1.1 配置MySQL可以使用的内存上限

1.2 配置每个MySQL连接(线程)使用的内存

# 排序缓冲区

sort_buffer_size

# 连接查询缓冲区

join_buffer_size

# 对MyISAM进行全表扫描时的读缓冲区

read_buffer_size

# 索引缓冲区

read_rnd_buffer_size

1.3 为缓存池分配内存

# innodb缓存池:总内存-(每个线程内存*连接数)-系统保留内存;经验值为服务器内存的75%

Innodb_buffer_pool_size

# MyISAM缓存池:即使数据库表全部为InnoDB,也要分配此缓存池(因为MySQL系统表依然使用MyISAM引擎)

key_buffer_size

# 以下sql可以查看

mysql> select sum(index_length) from information_schema.tables where engine = 'myisam'\G;

2. IO配置参数

2.1 InnoDB

# 事务日志文件大小(如果业务繁忙,建议事务日志文件大小设置大些)

Innodb_log_file_size

# 事务日志文件数量

Innodb_log_files_in_group

# 事务日志缓冲区,不需要太大,32M-128M足够了(事务日志不是直接写入磁盘文件)

Innodb_log_buffer_size

# 事务日志刷新频率

# 0:每秒从缓冲区将log写入操作系统cache,并flush log到磁盘

# 1:每次提交事务,从缓冲区将log写入操作系统cache,并flush log到磁盘(默认)

# 2:每次提交事务,从缓冲区将log写入操作系统cache,每秒flush log到磁盘(建议)

Innodb_flush_log_at_trx_commit

# InnoDB数据文件和日志文件刷新方式

Innodb_flush_method=O_DIRECT(不缓存,直接写入存储设备,避免双重缓存)

# 设为1,InnoDB为每个表建立单独的表空间

Innodb_file_per_table=1(强烈建议)

# 双写缓冲,避免数据页没有写完整造成数据损坏,增加安全性

Innodb_doublewrite=1

2.2 MyISAM

# 延迟刷新关键字缓冲中的脏块到磁盘文件

# OFF:每次写操作后刷新键缓冲中的脏块到磁盘

# ON:只对制定了delay_key_write的表使用延迟刷新

# ALL:对所有表使用延迟刷新

delay_key_write

3. 安全配置参数

# 自动清理binlog日志的天数(至少覆盖两次全备间隔的天数)

expire_logs_days

# MySQL可以接受的包的大小 (建议32M左右)

max_allow_packet

# 禁用DNS查找(此时应使用ip授权,或者对MySQL服务器host中出现的域名授权)

skip_dns_resolve

# 确保sysdate()返回确定性日期

sysdate_is_now

# 禁止非super权限用户写操作(建议在从库中启用)

read_only

# 禁止slave重启后自动复制(建议在从库启用)

skip_slave_start

# MySQL使用的sql模式

sql_mode

4. 其它配置参数

# MySQL何时向磁盘刷新binlog

# 0:不主动刷新,操作系统决定何时刷新(默认为0)

# n:没n次写操作,向磁盘刷新binlog(建议Master设为1)

sync_binlog

# 控制内存临时表大小(设为一致,不要太大)

tmp_table_size和max_heap_table_size

# MySQL允许的最大连接数(默认为100,建议1000、2000...)

max_connections

最后,MySQL服务器参数配置应综合考虑硬件环境、操作系统以及业务场景等多种因素。