mysql 5.7 innodb 预热_MySQL ( MGR ) 04-MYSQL5.7 InnoDB重要参数优化

innodb_buffer_pool_size

这个是Innodb最重要的参数,和MyISAM的key_buffer_size有相似之处,但也是有差别的。

这个参数主要缓存innodb表的索引,数据,插入数据时的缓冲。

该参数分配内存的原则:

这个参数默认分配只有8M,可以说是非常小的一个值。如果是一个专用DB服务器,那么他可以占到内存的70%-80%。

这个参数不能动态更改,所以分配需多考虑。分配过大,会使Swap占用过多,致使Mysql的查询特慢。

如果你的数据比较小,那么可分配是你的数据大小+10%左右做为这个参数的值。

例如:数据大小为50M,那么给这个值分配innodb_buffer_pool_size=64M

设置方法,在my.cnf文件里:

innodb_buffer_pool_size=2048M or 2G

在Mysql5.7版本之前,调整innodb_buffer_pool_size大小必须在my.cnf配置里修改,

然后重启mysql进程才可以生效。如今到了Mysql5.7版本,就可以直接动态调整这个参数(重启后依然读取my.cnf的配置值)

需要注意的地方:

在调整innodb_buffer_pool_size 期间,用户的请求将会阻塞,直到调整完毕,

所以请勿在白天调整,在凌晨3-4点低峰期调整。

调整时,内部把数据页移动到一个新的位置,单位是块。如果想增加移动的速度,

需要调整innodb_buffer_pool_chunk_size参数的大小,默认是128M。

说明: 2147483648 /1024*1024=2048M

root@127.0.0.1:(none) [03:38:23] 10 SQL->SELECT @@innodb_buffer_pool_size;

+---------------------------+

| @@innodb_buffer_pool_size |

+---------------------------+

| 2147483648 |

+---------------------------+

root@127.0.0.1:(none) [03:38:26] 11 SQL->SELECT @@innodb_buffer_pool_chunk_size;

+---------------------------------+

| @@innodb_buffer_pool_chunk_size |

+---------------------------------+

| 134217728 |

+---------------------------------+

root@127.0.0.1:(none) [03:38:38] 12 SQL->select @@innodb_buffer_pool_instances;

+--------------------------------+

| @@innodb_buffer_pool_instances |

+--------------------------------+

| 8 |

+--------------------------------+

监控Buffer Pool调整进程

root@127.0.0.1:(none) [03:52:59] 3 SQL->

SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';

+----------------------------------+-------+

| Variable_name | Value |

+----------------------------------+-------+

| Innodb_buffer_pool_resize_status | |

+----------------------------------+-------+

root@127.0.0.1:(none) [03:53:19] 4 SQL->

root@127.0.0.1:(none) [03:53:20] 5 SQL->SELECT @@innodb_buffer_pool_size;

+---------------------------+

| @@innodb_buffer_pool_size |

+---------------------------+

| 2147483648 |

+---------------------------+

#因为 innodb_buffer_pool_instances=8 * innodb_buffer_pool_chunk_size=128M 结果为 1G

#故 innodb_buffer_pool_size 必须为 1G的整数倍(以下配置为2.5,但实际是3G)

root@127.0.0.1:(none) [03:53:37] 8 SQL->SET GLOBAL innodb_buffer_pool_size=2684354560;

root@127.0.0.1:(none) [03:57:03] 9 SQL->SELECT @@innodb_buffer_pool_size;

+---------------------------+

| @@innodb_buffer_pool_size |

+---------------------------+

| 3221225472 |

+---------------------------+

root@127.0.0.1:(none) [03:57:18] 10 SQL->SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';

+----------------------------------+----------------------------------------------------+

| Variable_name | Value |

+----------------------------------+----------------------------------------------------+

| Innodb_buffer_pool_resize_status | Completed resizing buffer pool at 210131 15:57:03. |

+----------------------------------+----------------------------------------------------+

innodb_buffer_pool_chunk_size的大小,计算公式是innodb_buffer_pool_size/innodb_buffer_pool_instances

比如现在初始化innodb_buffer_pool_size为2G,innodb_buffer_pool_instances实例为8,innodb_buffer_pool_chunk_size设置为1G,那么会自动把innodb_buffer_pool_chunk_size 1G调整为256M.

[root@xag200 ~]#

mysqld --innodb_buffer_pool_size=2147483648 --innodb_buffer_pool_instances=8 --innodb_buffer_pool_chunk_size=1073741824;

root@127.0.0.1:(none) [03:45:07] 1 SQL->SELECT @@innodb_buffer_pool_size;

+---------------------------+

| @@innodb_buffer_pool_size |

+---------------------------+

| 2147483648 |

+---------------------------+

root@127.0.0.1:(none) [03:45:27] 2 SQL->SELECT @@innodb_buffer_pool_instances;

+--------------------------------+

| @@innodb_buffer_pool_instances |

+--------------------------------+

| 8 |

+--------------------------------+

root@127.0.0.1:(none) [03:45:37] 3 SQL->SELECT @@innodb_buffer_pool_chunk_size;

+---------------------------------+

| @@innodb_buffer_pool_chunk_size |

+---------------------------------+

| 268435456 |

+---------------------------------+

innodb_additional_mem_pool_size

用来存放Innodb的内部目录,这个值不用分配太大,系统可以自动调。通常设置16M够用了,如果表比较多,可以适当的增大。

设置方法,在my.cnf文件里:

innodb_additional_mem_pool_size = 16M

关于日志方面

3.1 innodb_log_file_size

作用:指定在一个日志组中,每个log的大小。

结合innodb_buffer_pool_size设置其大小,25%-100%。避免不需要的刷新。

注意:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。

一般取256M可以兼顾性能和recovery的速度。

分配原则:几个日志成员大小加起来差不多和你的innodb_buffer_pool_size相等。上限为每个日志上限大小为4G.

一般控制在几个Log文件相加大小在2G以内为佳。具体情况还需要看你的事务大小,数据大小为依据。

说明:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。

设置方法:在my.cnf文件里:

innodb_log_file_size = 256M

3.2 innodb_log_files_in_group

作用:指定你有几个日值组。

分配原则: 一般我们可以用2-3个日志组。默认为两个。

设置方法:在my.cnf文件里:

innodb_log_files_in_group=3

3.3 innodb_log_buffer_size:

作用:事务在内存中的缓冲,也就是日志缓冲区的大小, 默认设置即可,具有大量事务的可以考虑设置为16M。

如果这个值增长过快,可以适当的增加innodb_log_buffer_size

另外如果你需要处理大量的TEXT,或是BLOB字段,可以考虑增加这个参数的值。

设置方法:在my.cnf文件里:

innodb_log_buffer_size=3M

3.4 innodb_flush_log_at_trx_commit

作用:控制事务的提交方式,也就是控制log的刷新到磁盘的方式。

分配原则:这个参数只有3个值(0,1,2).默认为1,性能更高的可以设置为0或是2,

这样可以适当的减少磁盘IO(但会丢失一秒钟的事务。),游戏库的MySQL建议设置为0。主库请不要更改了。

其中:

0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,

但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;

1:(默认为1)在每次事务提交的时候将logbuffer 中的数据都会写入到log file,

同时也会触发文件系统到磁盘的同步;

2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。

此外,每秒会有一次文件系统到磁盘同步操作。

说明:

这个参数的设置对Innodb的性能有很大的影响,所以在这里给多说明一下。

当这个值为1时:innodb 的事务LOG在每次提交后写入日值文件,并对日值做刷新到磁盘。这个可以做到不丢任何一个事务。

当这个值为2时:在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新,

在对日志文件的刷新在值为2的情况也每秒发生一次。但需要注意的是,由于进程调用方面的问题,并不能保证每秒100%的发生。

从而在性能上是最快的。但操作系统崩溃或掉电才会删除最后一秒的事务。

当这个值为0时:日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,

但是在一个事务提交不做任何操作。mysqld进程的崩溃会删除崩溃前最后一秒的事务。

从以上分析,当这个值不为1时,可以取得较好的性能,

但遇到异常会有损失,所以需要根据自已的情况去衡量。

设置方法:在my.cnf文件里:

innodb_flush_logs_at_trx_commit=1

文件IO分配,空间占用方面

4.1 innodb_file_per_table

作用:使每个Innodb的表,有自已独立的表空间。如删除文件后可以回收那部分空间。

默认是关闭的,建议打开(innodb_file_per_table=1)

分配原则:只有使用不使用。但DB还需要有一个公共的表空间。

设置方法:在my.cnf文件里:

innodb_file_per_table=1

4.2 innodb_file_io_threads

作用:文件读写IO数,这个参数只在Windows上起作用。在Linux上只会等于4,默认即可!

设置方法:在my.cnf文件里:

innodb_file_io_threads=4

4.3 innodb_open_files

作用:限制Innodb能打开的表的数据。

分配原则:这个值默认是300。如果库里的表特别多的情况,可以适当增大为1000。innodb_open_files的大小对InnoDB效率的影响比较小。但是在InnoDBcrash的情况下,innodb_open_files设置过小会影响recovery的效率。所以用InnoDB的时候还是把innodb_open_files放大一些比较合适。

设置方法:在my.cnf文件里:

innodb_open_files=800

4.4 innodb_data_file_path

指定表数据和索引存储的空间,可以是一个或者多个文件。最后一个数据文件必须是自动扩充的,

也只有最后一个文件允许自动扩充。这样,当空间用完后,自动扩充数据文件就会自动增长(以8MB为单位)以容纳额外的数据。

例如: innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend 两个数据文件放在不同的磁盘上。

数据首先放在ibdata1 中,当达到900M以后,数据就放在ibdata2中。

设置方法,在my.cnf文件里:

innodb_data_file_path =ibdata1:1G;ibdata2:1G;ibdata3:1G1G:autoextend

4.5 innodb_data_home_dir

放置表空间数据的目录,默认在mysql的数据目录,设置到和MySQL安装文件不同的分区可以提高性能。

设置方法,在my.cnf文件里:(比如mysql的数据目录是/data/mysql/data,这里可以设置到不通的分区/home/mysql下)

innodb_data_home_dir = /home/mysql

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值