Преодоление ограничения MySQL в 2 ^ 32 строки в таблице MyISAM - PullRequest
3 голосов
/ 12 июля 2010

Я хочу создать таблицу MyISAM в MySQL (пробовал различные версии 5.0.x и 5.1.x), которая допускает более 2 ^ 32 строк.Чтобы добиться этого, нужно заставить MySQL использовать 8-байтовые вместо 4-байтовых указателей строк.

Вот цитата из руководства MySQL:

Если вы строите MySQL сопция --with-big-tables, ограничение строки увеличено до 1.844E + 19 строк.См. Раздел 2.3.2, «Типичные параметры конфигурации».Двоичные дистрибутивы для Unix и Linux создаются с этой опцией.

Звучит просто, верно?Но я пробовал различные бинарные дистрибутивы для Linux x86_64, а также собирал MySQL из исходного кода с опцией --with-big-tables.В любом случае я все еще не могу выйти за пределы 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 ]

5 голосов
/ 13 июля 2010

Я решил это для себя, и ответ прост и абсурден.

Если вы пропустите параметр 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;

И проверьте это с помощью:

SHOW VARIABLES LIKE 'myisam_data_pointer_size';

В таблице MyISAM с строками фиксированной ширины максимальное количество строк равно (2 ^ (8 * myisam_data_pointer_size)) - 1, учитывая myisam_data_pointer_size во время создания таблицы.

0 голосов
/ 12 июля 2010

Если вы компилируете mysql с использованием параметра --with-big-tables, ограничение строки увеличивается до (2 ^ 32) ^ 2. К сожалению, это самый высокий предел:)

...