IT技术博客大学习 共学习 共进步

更改Innodb 数据页大小优化MySQL

MySQL支持 2009-12-13 18:04:08 累计浏览 2,603 次

     我们知道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!

建议继续学习

  1. Innodb IO优化-配置优化 (累计阅读 7,605)
  2. Innodb分表太多或者表分区太多,会导致内存耗尽而宕机 (累计阅读 7,567)
  3. Innodb 表和索引结构 (累计阅读 6,042)
  4. InnoDB线程并发检查机制 (累计阅读 5,605)
  5. Innodb如何使用内存 (累计阅读 5,103)
  6. Innodb文件表空间结构 (累计阅读 5,067)
  7. 快速预热Innodb Buffer Pool的方法 (累计阅读 4,985)
  8. InnoDB的缓存替换策略及其效果 (累计阅读 4,783)
  9. 多版本并发控制:PostgreSQL vs InnoDB (累计阅读 4,564)
  10. InnoDB之Dirty Page、Redo log (累计阅读 4,483)