Хранение данных изображения в базе данных MySQL?

Я реализую проект, который обрабатывает значительное количество изображений.

По вашему мнению, какие плюсы и минусы имеют следующие два подхода:

  • Мне нужно хранить тысячи элементов, каждый элемент - как несколько свойств строки и изображения.
  • Каждый элемент как идентификатор (целое число)
  • Таблицы MyISAM
  • Как сохранить изображения:
    • подход 1: хранить изображения в каталоге и каждое изображение с именем ID.jpg
    • подход 2: сохранение изображений в базе данных как двоичный BLOB

Использование подхода 1 Я могу получить доступ к изображению напрямую и что он

<img src="same_directory/10.jpg" />  

Используя подход 2, я все еще могу использовать вышеуказанный HTML, но мне нужно перенаправить этот jpg-доступ к PHP script, который вернет реальное изображение из БД.

С точки зрения производительности, который, по вашему мнению, быстрее?

Я стремлюсь приблизиться к 1.

Ответ 1

преимущества подхода 1:

  • Получение веб-сервера с плоской файловой формой происходит быстрее.
  • большинство веб-хостов, вероятно, будут следовать этому подходу.
  • файловая система работает быстрее для хранения файлов.

преимущества подхода 2:

  • Все ваши данные хранятся в одном месте, если вы переносите свои сайт/база данных, изображения будут только там
  • Легче сортировать/удалять/etc...
  • Поскольку вы должны обслуживать его через PHP скрипт, вы можете выполнить дополнительные вещи, такие как безопасность, если требуется, или обработка изображений (очевидно, вы можете сделать это и с плоским файлом, но вы должны сделать убедитесь, что безопасность не может быть обойдена, оставив изображения в общедоступной каталог).

рассмотрение подхода к эффективности 1 лучше всего продолжить.

Ответ 2

Хранение файловой системы происходит быстрее.

Ответ 3

У меня возникнет соблазн использовать первый подход, так как нет реальной ценности в загромождении базы данных с данными изображения. (Получение данных из базы данных также будет значительно медленнее, чем просто загрузить его с диска.)

Однако в качестве предположения вы можете не захотеть сохранить полный путь на диске к изображению в таблице базы данных, чтобы в будущем обеспечить переносимость. (т.е. просто сохраните часть пути и имя файла из "известной" базовой папки.)

Ответ 4

Храните файлы изображений в виде файлов изображений на сервере, чтобы снизить нагрузку на БД и позволить серверу обрабатывать кеширование и т.д. В целом, это действительно зависит от того, какие изображения мы говорим. Маленькие миниатюры (например, для значков файлов) не будут такими уж плохими, но я не буду хранить целые изображения в БД. В общем, я думаю, что подход файловой системы был бы быстрее.

Ответ 5

Позволяет исследовать проблему в веб-браузере. Когда вы загружаете страницу с 10 снимками, сохраненными в базе данных. Ваш браузер отправляет новый HTTP-запрос на сервер. Каждое соединение с запросом init DB и сторона сервера script. Или просто прочитайте статическое изображение из файловой системы.

что будет быстрее?

Другая часть - получение данных из файловой системы или базы данных. Если мы не используем кеш для базы данных (но для 10 ГБ изображений у вас должно быть 10 ГБ ОЗУ для кэширования этих данных). База данных и HTTP-сервер в любом случае считывают данные из файловой системы. Но я думаю, что HTTP-браузер читает данные быстрее, чем сервер базы данных.

Только одна вещь для хранилища базы данных - очень простая миграция данных с одного сервера на другой. Но это не важно для производительности системы.

И не забудьте сделать путь для изображений, таких как /a/b/c/abc.jpg - он будет быстрее для большого количества изображений, а затем поместить все изображения в один каталог.