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

时间:2010-07-12 13:53:18

标签: 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

2 个答案:

答案 0 :(得分:5)

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

如果在创建MyISAM表时忽略 MAX_ROWS设置,则该表不会受到行的2 ^ 32限制。相反,最大行数由指针大小决定,指针大小本身由全局变量myisam_data_pointer_size确定。

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

SET GLOBAL myisam_data_pointer_size=5;

使用以下方法检查:

SHOW VARIABLES LIKE 'myisam_data_pointer_size';

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

答案 1 :(得分:0)

如果使用--with-big-tables选项编译mysql,则行限制将增加到(2 ^ 32)^ 2。不幸的是,这是最高限度:)