Когда используется MySQL BLOB?
Я кодирую приложение, которое будет загружать и удалять многие файлы, я обычно просто перемещаю файлы в папку на сервере, называя их уникальной строкой id
. Но поскольку я понимаю, что MySQL также позволяет мне хранить двоичные данные (файлы), когда это будет лучший выбор?
Пожалуйста, используйте твердые аргументы, например, When использование BLOB будет означать производительность улучшение?.
P.S: Я использую MyISAM, если это имеет значение.
Спасибо.
UPDATE:
Связанные вопросы:
- Сохранение изображений в DB - Yea или Nay?
- Делать или не делать: хранить изображения в базе данных (спасибо Себастьяну)
ОБНОВЛЕНИЕ 2
Сохранение файлов в базе данных
не нужно. Я пытаюсь узнать, когда
это лучшая идея, чем хранение
их в папках.
Ответы
Ответ 1
Чтение:
который завершает
Если вам иногда нужно восстановить изображение, и оно должно быть доступно на несколько разных веб-серверов. Но я думаю, что в значительной степени это.
- Если он не должен быть доступен несколько серверов, всегда лучше поместите их в файловую систему.
- Если у него есть быть доступным на нескольких серверах и там действительно какая-то нагрузка в системы, вам понадобится какая-то распределенное хранилище.
Ответ 2
Если вы используете MySam db engine, тогда поля BLOB можно индексировать, чтобы вы могли выполнять быстрый поиск по вашим файлам с помощью базы данных.
Еще одно преимущество хранения файлов в BLOB-полях состоит в том, что они могут быть доступны более эффективно, чем файлы на диске (нет необходимости в обходе каталога, открытии, чтении, закрытии).
Если вы планируете хранить много файлов в MYSQL, обычно рекомендуется хранить файлы в отдельной таблице. Это позволяет сканировать метаинформацию без спотыкания над блобами. Затем, когда вам действительно нужно извлечь blob, JOIN будет достаточно эффективным.
Ответ 3
Ну, это немного устарело, но эта статья содержит несколько достойных аргументов для хранения BLOB: http://www.dreamwerx.net/site/article01.
В то время как вы не получаете прирост производительности как таковой, ваши изображения и еще что-то в БД, а не в каталоге, также должны устранять проблемы с hotlinking (при условии, что это общедоступное веб-приложение).
Ответ 4
Обязательно ли вы используете MySQL? Если нет, попробуйте ODBMS или PostgreSQL для хранения файлов, или вы можете сохранить только пути для файлов. Например, this.
Ответ 5
Memcache не является альтернативным решением, поскольку вам необходимо управлять резервированием и TTL для распределенных серверов, что затрудняет их поддержку.
Лучшее решение, на мой взгляд, состоит в том, чтобы публиковать статические данные на CDN, которые распределяются по дизайну и приватным статическим данным в БД для удобства распространения на нескольких серверах.
Каждый сервер может реализовать свой собственный Memcache при каждом ударе.
Если вы уже сохранили данные в файловой системе и хотите перенести их в базу данных, самый простой способ - создать таблицу с ключом, следующую таблицу:
KEY = '/image/filename' (строка местоположения файловой системы), value = BLOB (фактический файл) и создать оболочку, которая получит это из базы данных с помощью правила перезаписи и обработки приложений. Таким образом, вы можете использовать полную прозрачность с существующим кодом.