服务器硬件的优化
提升硬件设备,例如选择尽量高频率的内存(频率不能高于主板的支持)、提升网络带宽、使用SSD高速磁盘、提升CPU性能等。
CPU的选择:
- 对于数据库并发比较高的场景,CPU的数量比频率重要。
- 对于CPU密集型场景和频繁执行复杂SQL的场景,CPU的频率越高越好。
MySQL数据库配置优化
long-query-time=0.3
#慢查询日志的阈值设置,单位秒。
[mysqld] slow_query_log = on log-slow-queries = /home/mysql/log/mysqld-slow-query.log long-query-time = 3
innodb_buffer_pool_size
#缓冲池字节大小。推荐值为物理内存的50%~80%。
sql> show global variables like 'innodb_buffer_pool_size'; sql> show global status like 'Innodb_buffer_pool_pages_data'; sql> show global status like 'Innodb_buffer_pool_pages_total';
val = Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total * 100%
val > 95%
考虑增大 innodb_buffer_pool_size, 建议使用物理内存的75%
val < 95%
考虑减小 innodb_buffer_pool_size, 建议设置为:
Innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 / (1024*1024*1024)G
my.cnf既支持单位字节、也支持单位G或M,而session中修改仅支持单位字节的方式
innodb_buffer_pool_size = 2G #设置2G
innodb_buffer_pool_size = 2147483648 #设置2G
innodb_buffer_pool_size = 500M #设置500M
参考:https://www.49855.net/mysql-innodb_buffer_pool_size/
innodb_max_dirty_pages_pct=30
#脏页占innodb_buffer_pool_size的比例时,触发刷脏页到磁盘。
推荐值为25%~50%。
innodb_io_capacity=200
#后台进程最大IO性能指标。表示每秒刷新脏页的数量,默认200,如果SSD,调整为5000~20000
innodb_data_file_path
#指定innodb共享表空间文件的大小。
innodb_log_file_size
#过大,实例恢复时间长;过小,造成日志切换频繁。
innodb_flush_log_at_trx_commit=1
#用来控制redo log刷新到磁盘的策略。
- 0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作;
- 1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去;
- 2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
sync_binlog=1
#每提交1次事务同步写到磁盘中,可以设置为n。
- 0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log;
- >0,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。
当innodb_flush_log_at_trx_commit和sync_binlog 都为 1 时是最安全的,在mysqld 服务崩溃或者服务器主机crash的情下,binary log 只有可能丢失最多一个语句或者一个事务。
但是鱼与熊掌不可兼得,双11 会导致频繁的io操作,因此该模式也是最慢的一种方式。
binlog_format=row
#mysql复制的形式,row为MySQL8.0的默认形式。
sql> show global variables like ‘innodb_buffer_pool_size’;
参考:https://www.49855.net/mysql-binlog_format/
max_connections=200
#调高该参数则应降低interactive_timeout、wait_timeout的值。
参考:https://www.49855.net/mysql-innodb_buffer_pool_size/
general_log=0
#全量日志建议关闭。默认关闭。
sql> show global variables like ‘innodb_buffer_pool_size’;