MySql освобождает пространство больших двоичных объектов с помощью InnoDB

Мне нужно создать таблицу, которая будет содержать большой BLOB, который будет занимать 98% размера строки. Однако этот BLOB будет храниться в строке только временно и будет перемещен в другое место, а затем столбец BLOB будет установлен в NULL. Может ли MySQL повторно использовать это пространство или оно всегда будет частью строки? Если его нельзя повторно использовать автоматически, есть ли другой способ (например, таблица оптимизации), который я могу использовать, чтобы вручную освободить это пространство? В противном случае мне может потребоваться найти другое решение для обработки этого конкретного набора данных.


person AlexGad    schedule 30.04.2012    source источник
comment
Можете ли вы хранить его вне MySQL, скажем, Redis или другого хранилища ключей / значений?   -  person Maxim Krizhanovsky    schedule 30.04.2012
comment
Данные будут перемещены в другое хранилище (S3) с помощью пакетного асинхронного процесса. Первоначальная запись должна быть mysql для транзакционных целей. Я мог бы переместить его в другое хранилище, такое как Redis (или постоянная очередь сообщений) во время транзакции, но этот процесс должен быть быстрым, поэтому я не решаюсь добавлять другие движущиеся части. Вот почему я сосредоточен на том, можно ли / как освободить пространство после перемещения большого двоичного объекта на S3. Если нет абсолютно никакого способа восстановить, тогда Redis, вероятно, будет следующим вариантом, поскольку он является частью нашей архитектуры.   -  person AlexGad    schedule 30.04.2012


Ответы (1)


Похоже, вам определенно будет лучше использовать Redis или даже просто хранить свой blob в файловой системе. На самом деле это то, что я рекомендую; сохраните данные в файле и поместите имя файла в таблицу. После завершения асинхронной загрузки в s3 установите для него значение null. Если вы используете файловую систему, оптимизированную для обработки больших объектов, это всегда будет быстрее, чем вставка в базу данных.

Как именно хранятся большие двоичные объекты, зависит не только от длины данных, но и от версии mysql, которую вы фактически используете. Удаленные строки всегда можно использовать повторно, а если последующие вставки не используют пространство повторно, их можно восстановить с помощью таблицы оптимизации. Но таблица оптимизации заблокирует эту таблицу. Значит, вы второй раз тормозите систему.

person e4c5    schedule 02.05.2012
comment
Мне действительно нравится идея сохранить большой двоичный объект в нашем SAN. Чтобы поддерживать постоянную скорость, мы разбиваем процесс на два потока: один сохраняет данные mysql, а второй - двоичный объект в файловой системе (на самом деле SAN). Поскольку они работают параллельно, это так же быстро, как и сохранение всего целиком в mysql. Затем у нас есть процесс вакуумирования, который перемещает файл в S3 и отмечает новое место в контрольной записи mysql. Кажется, работает как шарм, даже после тестирования под нашей ожидаемой нагрузкой. - person AlexGad; 08.05.2012