1.Startup configuration

系统表空间的配置
innodb_data_file_path变量决定了系统表空间的名称,大小,还有其他属性。如果没有配置此参数,那么默认在数据目录下有一个12MB的ibdata1的文件就是系统表空间。

  1. mysql> show variables like 'innodb_data_file_path';
  2. +-----------------------+------------------------+
  3. | Variable_name | Value |
  4. +-----------------------+------------------------+
  5. | innodb_data_file_path | ibdata1:12M:autoextend |
  6. +-----------------------+------------------------+
  7. 1 row in set (0.00 sec)

这个变量的全语法信息:

file_name:file_size[:autoextend[:max:max_file_size]]

还可以指定是否自动扩展,最大值。file_size的单位可以指定为K,M,G。
可以指定多个ibdata文件,但只有最后一个可以加autoextend以及max限制。

[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

每次自动增长的值由innodb_autoextend_increment变量控制,默认是64MB

mysql> show variables like 'innodb_autoextend_increment';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| innodb_autoextend_increment | 64    |
+-----------------------------+-------+
1 row in set (0.01 sec)

如果有多个系统表空间,那么第一个系统表空间的最小应该可以容纳双写缓存的大小。双写缓存的大小取决于页的大小:

Page Size (innodb_page_size) Minimum File Size
16384 (16KB) or less 3MB
32768 (32KB) 6MB
65536 (64KB) 12MB

如果不想将表空间放在默认数据目录下,需要指定innodb_data_home_dir:

[mysqld]
innodb_data_home_dir = /myibdata/
innodb_data_file_path=ibdata1:50M:autoextend

innodb_data_home_dir的默认值是./,也就是数据目录。如果指定了新的目录,新的目录需要存在。如果innodb_data_home_dir是空的,也可以在设置innodb_data_file_path时指定绝对路径。

redo log的配置
默认情况下,Innodb会创建两个5MB的ib_logfile0,ib_logfile1文件到数据目录下。
innodb_log_group_home_dir变量可以控制redo log的存放位置,指定的目录需要存在
innodb_log_files_in_group可以指定redolog的数量。
innodb_log_file_size指定单个redolog的大小,innodb_log_file_size*innodb_log_files_in_group的大小不可以超过最大值512GB。

undo表空间的配置

临时表空间的配置
默认情况下,临时表空间会存放在innodb_data_home_dir目录下,叫ibtmp1,初始大小是12MB。
可以修改innodb_temp_data_file_path变量来决定临时表空间的名称,大小以及最大值。

page的大小
innodb_page_size是innodb存储引擎中最小的存储单位,可以将该值设置为64KB,32KB,16KB(默认),8KB,4KB。保持page的大小跟存储设备的块大小一致,可以减少重写到磁盘时未修改的数据量。

memory的大小
innodb_buffer_pool_size决定了buffer pool的大小。这个值最好分配50-75的实际物理内存。默认是128MB。
当增大或者减少buffer pool 的大小时,Innodb会使用大块(chunk)来执行这个操作。innodb_buffer_pool_chunk_size决定了chunk的大小,默认是128MB。buffer pool的大小应该等于或者是数倍于chunkinnodb_buffer_pool_instances的大小。如果buffer pool的大小不等于或者不是数倍于chunkinstances,buffer pool会自动调整为相等或者数倍。

举个例子:
chunk默认是128MB,现在instances是16,128MB*16=2GB,现在buffer pool是8G,是2GB的整数倍。

shell> mysqld --innodb-buffer-pool-size=8G --innodb-buffer-pool-instances=16

mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                           8.000000000000 |
+------------------------------------------+

如果将buffer pool设置为9G,那么则不是2GB的整数倍,那么会向上自动取一个整数倍的值。

shell> mysqld --innodb-buffer-pool-size=9G --innodb-buffer-pool-instances=16

mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                          10.000000000000 |
+------------------------------------------+

innodb_buffer_pool_chunk_size的大小只能以1MB为单位来增加或者减少。这个变量只有在启动时才能修改:

shell> mysqld --innodb-buffer-pool-chunk-size=134217728

[mysqld]
innodb_buffer_pool_chunk_size=134217728

如果chunk*instances的大小超过了buffer pool的大小,那么chunk的大小将被截取到buffer pool/instances的大小
扩展buffer pool时可以动态扩展,如果扩展时存在事务,会等到事务结束才会扩展,如果扩展时产生了事务,会等到扩展结束才会开始事务。
对于buffer pool的大小在千兆字节范围内的系统,提高instances的值将会减少不同线程对缓存页的读写争用从而提高并发度。instances默认是1,最大64,只有当buffer pool大于1GB时,此参数才会生效。最佳效率是,每个instances的大小为1GB。