根据bug#64170的描述,一个page在读入内存时就已经计算了一次checksum:
|–>buf_read_page (buf0buf.c:2543)
2612 case BUF_BLOCK_ZIP_PAGE: 2613 case BUF_BLOCK_ZIP_DIRTY |–> success = buf_zip_decompress(block,
srv_use_checksums);
在函数buf_zip_decompress中,当设置了innodb_checksums时(对应内部变量srv_use_checksums),则在需要先计算比比较checksum,然后才会调用page_zip_decompress解压。
也就是说,对于一个page,总共进行了两次checksum,第二次明显是多余的。在MySQL5.6.7也已经移除了第二次checksum。
Performance : InnoDB : This fix removes redundant validation on InnoDB
. The checksum was being verified both when a compressed page was read from disk and when it was uncompressed. Now the verification is only performed when the page is read from disk. (Bug #14212892, Bug #64170) 根据Facebook的Mark Callaghan的测试,获得了5%的QPS提升。
在函数buf_LRU_free_block中,对于压缩page,即使是非脏页,也会去计算checksum,facebook为其增加了一个参数来控制,为false表示禁止这种行为,只checksum脏页
当buffer pool较小时,free list一般为空,这时候当需要从磁盘读取一个page后,就得从lru上驱逐一个block。因此会频繁的调用到buf_LRU_free_block
对于只读查询,这会减少一些CPU开销(简单的测试,很明显的usr cpu 从13%降到12%)