在MyISAM表中克服MySQL限制为2 ^ 32行

But*_*ers 3 mysql myisam

我想在MySQL中创建一个MyISAM表(尝试了各种版本的5.0.x和5.1.x),允许超过2 ^ 32行.实现这一目标的方法是让MySQL使用8字节而不是4字节的行指针.

以下是MySQL手册的引用:

如果使用--with-big-tables选项构建MySQL,则行限制将增加到1.844E + 19行.请参见第2.3.2节"典型配置选项".Unix和Linux的二进制发行版使用此选项构建.

听起来很简单吧?但是我已经为Linux x86_64尝试了各种二进制发行版,并且还使用"--with-big-tables"选项从源代码构建MySQL.在每种情况下,我仍然无法超越2 ^ 32的限制.我这样创建一个表:

CREATE TABLE big (col int) MAX_ROWS=1099511627776

当我检查表状态时,它说:

Create_options: max_rows=4294967295

我如何逃脱32位炼狱?使用InnoDB可能会解决问题,但对于我正在运行的查询类型,它的执行速度要慢得多.

仅供参考,这是一个没有解决问题的重要参考:

http://jeremy.zawodny.com/blog/archives/000796.html

But*_*ers 5

我为自己解决这个问题,答案既简单又荒谬.

如果你离开了的MAX_ROWS创建一个MyISAM表时设置,则该表不会从行2 ^ 32限制吃亏.相反,最大行数由指针大小决定,指针大小本身由全局变量myisam_data_pointer_size确定.

默认情况下,myisam_data_pointer_size是6上现代建立的MySQL在Linux/Unix运行,导致的2 ^ 48行上具有固定的行宽的表(或2 ^ 48字节的表上具有动态行)的限制.但您也可以使用以下内容进行更改:

SET GLOBAL myisam_data_pointer_size=5;
Run Code Online (Sandbox Code Playgroud)

并使用以下方法检查:

SHOW VARIABLES LIKE 'myisam_data_pointer_size';
Run Code Online (Sandbox Code Playgroud)

在具有固定宽度的行MyISAM表,行的最大数目等于(2 ^(8*myisam_data_pointer_size)) - 1,在创建表时赋予myisam_data_pointer_size.