修改Innodb的数据页大小以优化MySQL的方法
我们知道Innodb的数据页是16K,而且是一个硬性的规定,系统里没更改的办法,希望将来MySQL也能也Oracle一样支持多种数据页的大小。
但实际应用中有时16K显的有点大了,特别是很多业务在Oracle或是SQLSERVER运行的挺好的情况下迁到了MySQL上发现IO增长太明显的情况下,
就会想到更改数据页大小了。
实际上innodb的数据页大小也是可以更改的,只是需要在源码层去更改,然后重新rebuild一下MySQL.
更改办法:
(以MySQL-5.1.38源码为例)
位置在storage/innobase/include/univ.i,在univ.i中查找:UNIV_PAGE_SIZE
/* DATABASEVERSIONCONTROL ======================== */ /*Theuniversalpagesizeofthedatabase*/ #defineUNIV_PAGE_SIZE(2*8192)/*NOTE!Currently,thishastobea powerof2*/ /*The2-logarithmofUNIV_PAGE_SIZE:*/ #defineUNIV_PAGE_SIZE_SHIFT14 /*Maximumnumberofparallelthreadsinaparallelizedoperation*/ #defineUNIV_MAX_PARALLELISM32
UNIV_PAGE_SIZE就是数据页大小,默认的是16K.后面的备注里标明,该值是可以设置必须为2的次方。对于该值可以设置成4k,8k,16k,32K,64K,在大也没意义了。
同时更改了UNIV_PAGE_SIZE后需要更改UNIV_PAGE_SIZE_SHIFT该值是2的多少次方为UNIV_PAGE_SIZE,所以设置数据页分别情况如下:
#defineUNIV_PAGE_SIZE_SHIFT12ifUNIV_PAGE_SIZ=4K #defineUNIV_PAGE_SIZE_SHIFT13ifUNIV_PAGE_SIZ=8K #defineUNIV_PAGE_SIZE_SHIFT15ifUNIV_PAGE_SIZ=32K
例子:
更改innodb的数据页为8K,相应修改为:
/* DATABASEVERSIONCONTROL ======================== */ /*Theuniversalpagesizeofthedatabase*/ #defineUNIV_PAGE_SIZE8192/*NOTE!Currently,thishastobea powerof2*/ /*The2-logarithmofUNIV_PAGE_SIZE:*/ #defineUNIV_PAGE_SIZE_SHIFT13 /*Maximumnumberofparallelthreadsinaparallelizedoperation*/ #defineUNIV_MAX_PARALLELISM32
重新编译,然后测试测试,再测试。Goodluck!