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

克服MyISAM表中2^32行的MySQL限制,mysql,myisam,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

我想在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=109951162776

当我检查表格状态时,它会显示:

创建选项:最大行数=4294967295

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

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


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

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

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

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

SET GLOBAL myisam_data_pointer_size=5;
并使用以下方法进行检查:

SHOW VARIABLES LIKE 'myisam_data_pointer_size';

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

你确定你需要这么多行吗?@Fosco:如果他正在处理,假设他是。@drow:谢谢你,没什么。是的,我当然需要那么多排!但问题是,这并没有发生。它保持在2^32,即使在使用该选项编译时也是如此(在x86_64上,这并不是说这会有什么不同)。另一个限制是大小为256TB,但我认为这不是您的情况。我从未试图达到这些极限。我很确定这是一个工程问题,你可以避免这些限制。