原文連結http://www.mysqlsupport.cn/change_innodb_page_size/
作者:吳炳錫 來源: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!