从MySQL5.6.3开始 ,Innodb引入了新的checksum计算方式,checksum算法由新参数 innodb_checksum_algorithm
来控制,默认为crc32算法,主要有两种算法,一种是老的计算方法(innodb_checksum_algorithm=innodb),使用这种算法是兼容老版本的MySQL。但如果使用crc32算法,则会无法兼容老版本,因为使用了不同的算法计算checksum,会导致校验page失败。
当设置为none时,则在page中写入一个常量(BUF_NO_CHECKSUM_MAGIC)
另外还有两个值strict_innodb 和strict_crc32 ,当设置为这两个值时,如果该表存在混合的checksum计算方式, 则只根据当前的设置计算一次,而不会使用别的算法计算checksum。
在Percona版本的5.5.18中,也引入了一种快速checksum方法(对应的函数为buf_calc_page_new_checksum_32),由参数innodb_fast_checksum控制,但该参数不影响压缩page的checksum,压缩页单独计算,调用page_zip_calc_checksum
有趣的是,我在innodb status里增加了checksum耗时统计,并让5.5.18支持Percona 本身的fast checksum,发现其居然比老的checksum计算方式耗时要长。当然都在毫秒级别
值得一提的是,CRC32算法由Facebook贡献,具体代码可以在storage/innobase/ut/ut0crc32.cc查阅,算法采用了汇编来提高效率。社区的力量!!
鉴于CRC32和老checksum方式没有特别明显的改善(对于需要频繁I/O,读写Page的情况,效果会稍微明显些),对checksum优化的优先级降低