作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究。
我们知道Innodb的数据页是16K,而且是一个硬性的规定,系统里没更改的办法,希望将来MySQL也能也Oracle一样支持多种数据页的大小。
但实际应用中有时16K显的有点大了,特别是很多业务在Oracle或是SQL SERVER运行的挺好的情况下迁到了MySQL上发现IO增长太明显的情况下,
就会想到更改数据页大小了。
实际上innodb的数据页大小也是可以更改的,只是需要在源码层去更改,然后重新rebuild一下MySQL.
更改办法:
(以MySQL-5.1.38源码为例)
位置在storage/innobase/include/univ.i ,在univ.i中查找:UNIV_PAGE_SIZE
/*
DATABASE VERSION CONTROL
========================
*/
/* The universal page size of the database */
#define UNIV_PAGE_SIZE (2 * 8192) /* NOTE! Currently, this has to be a
power of 2 */
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 14
/* Maximum number of parallel threads in a parallelized operation */
#define UNIV_MAX_PARALLELISM 32
UNIV_PAGE_SIZE就是数据页大小,默认的是16K. 后面的备注里标明,该值是可以设置必须为2的次方。对于该值可以设置成4k,8k,16k,32K,64K,在大也没意义了。
同时更改了UNIV_PAGE_SIZE后需要更改 UNIV_PAGE_SIZE_SHIFT 该值是2的多少次方为UNIV_PAGE_SIZE,所以设置数据页分别情况如下:
#define UNIV_PAGE_SIZE_SHIFT 12 if UNIV_PAGE_SIZ=4K
#define UNIV_PAGE_SIZE_SHIFT 13 if UNIV_PAGE_SIZ=8K
#define UNIV_PAGE_SIZE_SHIFT 15 if UNIV_PAGE_SIZ=32K
例子:
更改innodb的数据页为8K,相应修改为:
/*
DATABASE VERSION CONTROL
========================
*/
/* The universal page size of the database */
#define UNIV_PAGE_SIZE 8192 /* NOTE! Currently, this has to be a
power of 2 */
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 13
/* Maximum number of parallel threads in a parallelized operation */
#define UNIV_MAX_PARALLELISM 32
重新编译,然后测试测试,再测试。Good luck!
innodb plugin已经可以设置page size,通过设置page size来实现block的压缩功能。
对了,请问最终你有没有进行测试?测试结果能否公布?
xtradb准备支持多page size,在创建数据库时可以指定,其他的很多特性也很吸引人
现在的局面是innodb及其相关的变种(innodb build in & plug &xtradb)的统一性问题,怕越来越不兼容,不知道他们的互相交流怎么样。
还有mariadb包含的新引擎PBXT和maria也值得关注
http://www.mysqlperformanceblog.com/2010/03/17/percona-xtradb-9-1-released-and-new-coming-features/
@ruochen,
这个好象也是Innodb-plugin,只是支持Page的压缩。并不是真正的PageSize更改。保持关注。
5.1.45版本的是这样了
不知道为什么mysql一直将这个钉死为16k
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 14
/* The universal page size of the database */
#define UNIV_PAGE_SIZE (1 << UNIV_PAGE_SIZE_SHIFT)
/* Maximum number of parallel threads in a parallelized operation */
#define UNIV_MAX_PARALLELISM 32
@ruochen,
这个和MySQL内部实现有一定的关系。并不是所有的业务都适合改成8K。
8K的效果比16K的好了很多。
我原意也想主要问8k vs 16k,手误成18k了,哈哈
对4k 8k 18k做测试的对比有么?
@ruochen,
Innodb的页只支持2的N次方,所以18K的不能测试。另外不建议用4K的,有可能会在测试中遇到导数据都超过限制的现象。改为8K的,测试效果比原来的好了很多。我们的业务CPU从40%下降到了30%。如果你统计分析环境建议用大点的叶块。
后补:
对于该值的修改如果存在担心可以用 grep -r “UNIV_PAGE_SIZE” * 在innobase那个目录 看看调用的位置去肯定一下。欢迎拍砖。目前我测试没问题。可以用于生产。