Обработка огромных BLOB-объектов в MySQL?

Как я могу вставить огромные BLOB-объекты в базу данных MySQL (InnoDB)?

Поля типа LONGBLOB поддерживают размер данных до 4 ГБ в соответствии с руководством по MySQL. Но как данные такого огромного размера попадают в базу данных?

я пытался использовать

INSERT INTO table (bindata) VALUES ( LOAD_FILE('c:/tmp/hugefile') );

который терпит неудачу, если размер огромного файла больше, чем около 500 МБ. Я установил max_allowed_packet на соответствующий размер; значение innodb_buffer_pool_size, похоже, не влияет.

Мой сервер работает под управлением Windows Server 2003 и имеет 2 ГБ ОЗУ. Я использую MySQL 5.0.74-enterprise-nt.


person oli_arborum    schedule 03.06.2009    source источник
comment
То, что вы можете, не означает, что вы должны.   -  person Kekoa    schedule 03.06.2009
comment
@kekoav Я знаю, что в определенных средах лучше хранить файлы в файловой системе, чем в БД, но независимо от этого обсуждения я должен знать, как это работает, чтобы хранить такие данные, чтобы иметь возможность попробовать и составить мнение о преимущества и недостатки обоих решений (хранение в файловой системе и хранение в БД). Спасибо за понимание заранее!   -  person oli_arborum    schedule 03.06.2009


Ответы (2)


BLOB-объекты кэшируются в памяти, поэтому у вас будет 3 копии BLOB-объекта при его вставке в базу данных.

Ваш BLOB размером 500 МБ занимает 1500 МБ в ОЗУ, что, похоже, превышает ваш предел памяти.

person Quassnoi    schedule 03.06.2009
comment
Итак, мне нужна 64-битная машина с 12 ГБ ОЗУ, чтобы иметь возможность вставлять 4 ГБ BLOB? - person oli_arborum; 03.06.2009
comment
@oli_arborum: Похоже на то. См. здесь: mysql.com/news-and-events /newsletter/2003-09/a0000000237.html - person Quassnoi; 03.06.2009
comment
MySQL поддерживает BLOB (большие двоичные объекты), что означает, что вы можете хранить любой двоичный файл в MySQL. Многие спрашивают, каков максимальный размер BLOB в MySQL. Теоретический предел в MySQL 4.0 составляет 2 ГБ, однако каждый большой двоичный объект обычно требует наличия 3 его копий в памяти (хранящихся в различных буферах), поэтому вам потребуется много памяти, если у вас есть большие BLOB-объекты, хранящиеся в MySQL. По этой причине теоретический предел может быть достигнут только на 64-битных системах. Практические ограничения составляют около нескольких сотен мегабайт на BLOB. - Последний доступный моментальный снимок archive.org 20100208201732 - person Rein State; 07.09.2020
comment
Все еще онлайн в архиве списка рассылки nyphp.org/pipermail/talk/2003-September/ 005737.html. - person Rein State; 07.09.2020

Я не знаю, какой клиент/API вы используете, но при попытке использовать большие двоичные объекты из собственных клиентов Java и Objective-C кажется, что MySQL на самом деле не поддерживает потоковую передачу больших двоичных объектов. Вам нужно достаточно памяти, чтобы хранить весь большой двоичный объект в виде массива байтов в оперативной памяти (на стороне сервера и на стороне клиента) более одного раза! Переход на 64-битный Linux помогает, но не является желаемым решением.

MySQL не предназначен для обработки BLOB (хорошо для небольших BOB :-). Он занимает вдвое или втрое больше оперативной памяти для хранения/чтения в «BLOB».

Вы должны использовать другую базу данных, такую ​​​​как PostgreSQL, чтобы получить реальную поддержку BLOB, извините.

person Arne Burmeister    schedule 03.06.2009
comment
Чтобы не нуждаться в оперативной памяти sizeof(BLOB) на клиенте, я использовал клиент командной строки mysql и функцию LOAD_FILE(), которая использует только оперативную память сервера. - person oli_arborum; 03.06.2009