MySQL内核InnoDB存储引擎详解(10)

change buffering是MySQL5.5加入的新特性, change buffering是insert buffer的加强, insert buffer只针对insert有效, change buffering对insert、 delete、 update(delete+insert)、 purge都有效。当修改一个索引块(secondary index)时的数据时,索引块在buffter pool中不存在,修改信息就会被cache在change buffer中,当通过索引扫描把需要的索引块读取到buffer pool时,会和change buffer中修改信息合并,再择机写回disk。

目的还是为了减少随机IO带来性能损耗

Change buffer是作为buffer pool中的一部分存在。

Innodb_change_buffering参数缓存所对应的操作: (update会被认为是delete+insert)

all: 默认值,缓存insert, delete, purges操作 
none: 不缓存 
inserts: 缓存insert操作 
deletes: 缓存delete操作 
changes: 缓存insert和delete操作 
purges: 缓存后台执行的物理删除操作 
innodb_change_buffer_max_size参数配置change buffer在buffer pool中所占的最大百分比,默认是25%,最大可以设置为50%。 当MySQL实例中有大量的修改操作时,要考虑增大innodb_change_buffer_max_size。

InnoDB线程并发度配置

InnoDB利用操作系统的线程技术达到多线程实现。 
Innodb_thread_concurrency参数限制同时执行的线程数。默认值是0代表没有限制。 
Innodb_thread_sleep_delay参数确定

InnoDB后台IO线程配置

通过配置innodb_read_io_threads和innodb_write_io_threads参数来指定后台读和写数据页的线程的个数,默认值是4,容许的取值范围是1-64。

mysql> show engine innodb status\G
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
....

使用Linux异步IO

InnoDB在Linux平台使用异步IO子系统完成数据文件页的读写请求,可以通过innodb_user_native_aio参数控制,默认是开启状态,并且需要libaio系统库支持

InnoDB主线程配置

InnoDB的主线程在后台承担了诸多的任务,绝大多数是和IO操作相关的,比如将buffer pool中的修改后的数据刷新的磁盘文件中。 
Innodb_io_capacity参数设置了InnoDB的整体IO能力。该参数应该被设置为等同于操作系统每秒的IO操作数量。该参数可以设置为100及以上的任意数值,默认值是200。其中设置为100相当于7200RPM的磁盘性能。

InnoDB purge配置

InnoDB的purge操作是一类垃圾回收操作,是由一个或多个独立线程自动执行。通过 
innodb_purge_threads参数设置purge线程的数量,如果DML操作比较复杂且涉及到多个表时,则可以考虑增加此值,最大可以设置为32. 
事务被提交后,其所使用的undolog可能不再需要因此需要PurgeThread来回收已经使用并分配的undo页

InnoDB 优化器统计信息配置

Innodb表的优化器统计信息分为永久和非永久两种。 
永久的优化器统计信息即使是服务器重启的情况下也会存在,其用来选出更优的执行计划以便提供更好的查询性能. 
通过配置innodb_stats_auto_recalc参数来控制统计信息是否在表发生巨大变化(超过10%的行)之后是否自动更新,但由于自动更新统计信息本身是异步的,所以有时未必能马上更新,这是可以执行analyze table语句来同步更新统计信息。

Create table和alter table语句中的Stats_persistent, stats_auto_recalc, stats_sample_pages子句可用来配置单个表的优化器统计信息规则

Stats_persistent用来指定是否对此表开启永久统计资料, 1代表开启, 0代表不开启。当开启之后, 
可以执行analyze table命令来收集统计资料。 
Stats_auto_recalc表示是否自动对表的永久统计资料进行重新计算,默认值和全局参数innodb_stats_auto_recalc一致。1代表当表中数据10%以上更新时重新计算, 0代表不自动更新,而是通过analyze table命令重新计算 
Stats_sample_pages表示当计算索引列的统计资料是需要的索引页的样本数量

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1fe1e788fe1712d1b3106819c6ce028f.html