最新消息:

更改Innodb 数据页大小优化MySQL

数据库 admin 2浏览

作者:吴炳锡 来源: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!

mysql.5.0.88 在 innobase/include/univ.i

测试插入2000W 条数据的

修改前
1. Query OK, 1 row affected (23 min 41.56 sec)
2. Query OK, 1 row affected (23 min 52.65 sec)

修改后
3. Query OK, 1 row affected (14 min 14.90 sec)
4. Query OK, 1 row affected (14 min 23.79 sec)相关日志升级最新 Nginx Mysql Php
mysql分页limit 优化
mysql 在线安装sphinx存储引擎
mysql Unknown command ”’.
mysql 5.5.9 编译安装

最后编辑: selboo 编辑于2009/12/24 11:38

转载请注明:爱开源 » 更改Innodb 数据页大小优化MySQL