3

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

4

2 回答 2

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。

于 2010-07-13T04:56:04.613 回答
0

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

于 2010-07-12T14:03:08.637 回答