Write by lyc at 2019-7-17
参考博文:
MySQL 优化系列(1)– InnoDB重要参数优化
一、内存相关
innodb_buffer_pool_size
- 主要缓存innodb表的索引,数据,插入数据时的缓存。 是Innodb加速优化最重要的参数,默认分配只有8M,必须配置。
- 类似于MyISAM的
key_buffer_size
,但MyISAM只缓存索引,不缓存数据。
- 如果是一个专用DB服务器,建议分配到物理内存的60%-80%。
- 这个参数在5.6不能动态更改,在5.7可以在线更改,但需要在业务低估时更改。
1
| innodb_buffer_pool_size=物理内存60%~80%
|
innodb_buffer_pool_instances
- InnoDB缓存池被分成的区域数
- 需配置成
innodb_buffer_pool_size
的整数倍,一般配置为4,8,最多不超过16
1
| innodb_buffer_pool_instances=8
|
innodb_buffer_pool_chunk_size
MySQL5.7新特性:innodb-buffer-pool-size新特性
尽量让innodb_buffer_pool_size = innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances
从而获取一个较佳的性能,5.7的参数
二、日志相关
innodb_log_file_size
指定在一个日志组中,每个log的大小。
结合innodb_buffer_pool_size设置其大小,25%-100%。避免不需要的刷新。
注意:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。一般取256M,可以兼顾性能和recovery的速度。
分配原则:几个日志成员大小加起来差不多和你的 innodb_buffer_pool_size
相等。上限为每个日志上限大小为4G.一般控制在几个Log文件相加大小在2G以内为佳。具体情况还需要看你的事务大小,数据大小为依据。
说明:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。
设置方法:在my.cnf文件里:
1
| innodb_log_file_size = 256M
|
innodb_log_files_in_group
指定你有几个日志组,默认为两个。一般我们可以用2-3个日志组。
1
| innodb_log_files_in_group=3
|
innodb_log_buffer_size
- 事务在内存中的缓冲,也就是日志缓冲区的大小
- 默认8M即可,具有大量事务的可以考虑设置为16M。
- 另外如果你需要处理大理的TEXT,或是BLOB字段,可以考虑增加这个参数的值。
1
| innodb_log_buffer_size=8M
|
innodb_flush_log_at_trx_commit
- 控制事务的提交方式,也就是控制log的刷新到磁盘的方式。
- 这个参数只有3个值
[0|1|2]
,默认为1,性能更高的可以设置为0或是2,这样可以适当的减少磁盘IO(但会丢失一秒钟的事务)
innodb_flush_log_at_trx_commit=1
innodb 的事务log在每次提交后写入日志文件,并对日志做刷新到磁盘。这个可以做到不丢任何一个事务。
innodb_flush_log_at_trx_commit=2
在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新,在对日志文件的刷新在值为2的情况也每秒发生一次。但需要注意的是,由于进程调用方面的问题,并不能保证每秒100%的发生。从而在性能上是最快的。但操作系统崩溃或掉电才会丢失最后一秒的事务。
innodb_flush_log_at_trx_commit=0
日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。mysqld进程的崩溃会删除崩溃前最后一秒的事务。
1 2 3 4 5 6 7
| # 主库,优先数据安全 innodb_flush_log_at_trx_commit=1 sync_binlog=1
# 从库,可以都等于1,保证数据安全。也可以提高性能,按如下配置。 innodb_flush_log_at_trx_commit=2 sync_binlog=10
|
三、文件IO分配,空间占用相关
innodb_file_per_table=1
- 开启独立表空间
- 当这个参数启用的时候,InnoDB会将新建表的数据和索引单独存放在.ibd格式的文件中,而不是存放在系统表空间中。当这张表被删除或TRUNCATE时,InnoDB表所占用的存储会被释放。这个设定会开启InnoDB的一些其他特性,比如表的压缩。
- 当这个参数关闭的时候,InnoDB会将表和索引的数据存放到系统表空间的ibdata文件中,这会有一个问题,因为系统表空间不会缩小,这样设置会导致空间无法回放。
innodb_open_files=65535
- 限制Innodb能打开的表的数据。
- 这个值默认是300。如果库里的表特别多的情况,可以适当增大为1000。
1
| innodb_open_files = 65535
|
innodb_data_file_path=ibdata1:1G:autoextend
- innodb共享表空间位置及大小:
指定表数据和索引存储的空间,可以是一个或者多个文件。最后一个数据文件必须是自动扩充的,也只有最后一个文件允许自动扩充。
- 当空间用完后,自动扩充数据文件就会自动增长(以8MB为单位)以容纳额外的数据。
- 例如: innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend 两个数据文件放在不同的磁盘上。数据首先放在ibdata1 中,当达到900M以后,数据就放在ibdata2中。
1 2
| innodb_data_file_path = ibdata1:1G:autoextend innodb_data_file_path = ibdata1:1G;ibdata2:1G;ibdata3:1G;ibdata4:1G;ibdata5:1G;ibdata6:1G:autoextend
|
四、其他相关参数
innodb_flush_method
1
| innodb_flush_method=O_DIRECT
|
innodb_max_dirty_pages_pct
- 当Innodb缓存池中脏页所占的百分比达到这个参数的值时,InnoDB会从缓存中向磁盘写入数据。默认值是75。
- 这个参数的另一个用处:当Innodb的内存分配过大,致使Swap占用严重时,可以适当的减小调整这个值,使达到Swap空间释放出来。
- 建义:这个值最大在90%,最小在15%。太大,缓存中每次更新需要致换数据页太多,太小,放的数据页太小,更新操作太慢。
1
| innodb_max_dirty_pages_pct=50
|
innodb_thread_concurrency
- InnoDB存储引擎可以并发使用的最大线程数。
- 当InnoDB使用的线程超过这参数的值时,后面的线程会进入等待状态,以先进先出的算法来处理。等待锁的线程不计入这个参数的值。这个参数的范围是0~1000。
- 默认值是0。当这个参数为0时,代表InnoDB线程的并发数没有限制,这样会导致MySQL创建它所需要的尽可能多的线程。
- 5.6以后为0,让mysqld自动调整
1 2 3
| innodb_thread_concurrency=0
也有推荐设置成cpu核心数
|