Хранение файлов в БД – зло?

Рубрики: Mysql

Сегодня я бы хотел рассмотреть один из вопросов поднятых недавно на форуме. Почему же так плохо хранить файлы в базе данных? Сейчас я постараюсь разложить все по полочкам, на примере  MySQL(полагаю актуально и для других БД в той или иной мере), дабы больше такого желания не возникало)

Итак, BLOB (Binary Large Object – большой бинарный объект), который используется для хранения двоичных данных, таких как, картинки, архивы, программы и т.д.

Хранение файлов в БД

Но почему, же использовать данный тип не желательно на практике? А все очень просто:

1) Быстрое раздутие БД – ведет к снижению производительности.
2) Большие объемы транзакций, что допускает длительные блокировки таблиц при вставках/обновлениях, особенно актуально при типах таблиц myISAM.
3) Более серьезные аппаратные требования к серверу баз данных.
4) Более дорогой шардинг в случае роста числа хранимых файлов.
5)  Необходимость наличия отдельного обработчика, который бы реализовывал отдачу файлов, а именно отправлял нужные HTTP-заголовки в зависимости от типа хранимого файла.

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

Надеюсь, данная заметка была для вас полезна =)

Метки: ,
Если Вам понравилась статья, то предлагаю вам подписаться на уведомления — это можно сделать любым из доступных способов.
Есть что сказать? Не проходите мимо — комментируйте! Мне важно ваше мнение!

15 комментария к “Хранение файлов в БД – зло?”

  • 7 марта 2010, 4:12

    Я в этом вообще не секу, но прочитал с интересом

  • 9 марта 2010, 11:28

    Согласен на все 245.87%, нет файлам в базе =)Вообще наблюдается тенденция повышенного внимания к NOSQL системам, а файлы предназначенные для отдачи пользователям напрямую, стараются раздавать через легкие веб-сервера (nginx, lighttpd) etc.

  • Creator
    9 марта 2010, 16:32

    Рад, что вам понравилось, буду стараться еще больше писать полезные и интересные посты =)

  • NatlieSEO
    10 марта 2010, 11:52

    Так это на всех курсах по Mysql всегда говорят, что картинкам в Базе не место.

  • Creator
    10 марта 2010, 13:39

    NatlieSEO :

    Так это на всех курсах по Mysql всегда говорят, что картинкам в Базе не место.

    Далеко не все имеют возможность посещать курсы.

  • 10 марта 2010, 19:27

    С картинками понятно. А как насчет статей?

  • Creator
    10 марта 2010, 20:41

    tigra60 :

    С картинками понятно. А как насчет статей?

    А что с ними? Не совсем понятен вопрос.

  • Rico
    18 марта 2010, 7:01

    Было дело… хранил файлы в базе. То же нормально работает.
    Есть недочёты по скорости и всё такое… но нормально.

    Тут компромис:
    - базе долго
    - в файле – нагрузка на io

    В любом случае использовать кеширование nginx для статики.

    Ну и потом важный вопрос: зачем файлы в базе?
    Если это лого для дальнейшей массовой рассылки – то можно и в базе, а если аватара юзера, то на харде самое место.

  • panika
    6 ноября 2010, 14:39

    Аокажи человека который станет пихать в БД файлы?
    Вода течет по наименьшему сопротивлению.
    ФАйл проще залить на хостинг нежели в Бд поэтому даже говнокодеры не станут такого делать.

  • 9 ноября 2010, 6:09

    Для чего тогда эту возможность ввели, если хранить в базе не эффективно?

  • 31 декабря 2010, 18:46

    По отношению к крупным проектам вопрос очень актуален – выскоие нагрузки на сервер, вероятность краха базы и так далее. но для небольших сайтов и блогов базы вполне удобны – легко разворачивать на любом хостинге при переносе сайта

  • leon
    12 февраля 2011, 13:09

        Хранение  бинарников  в  отдельных от   базы  файлах приводит  к  проблеме   консистентности данных.  Манипулируя  записями  о  файлах(документах, картинках  и  т.д.  нужно  выполнять  синхронные  манипулиции  с (нетранзакционной) файловой   системой и  наоборот.  А если  файл  в   БД прибили  а  на   диске  нет? Или наоборот  с  диска  кто то  удалил  а   в  БД запись  осталась.   А  как  бакапировать  и  восстанавливать или  переносить на  другой   сервер? А как  быть  с  распределенной  БД?
      Хранение  файлов   в  блобах обеспечивает  консистентность  данных  средствами  самой  БД.
       А для  того  чтобы   объем  не   сказывался  на   быстродействии –   просто  вынести  блобы   в  отдельную  таблицу, точнее  разделить  таблицу   с  записями  о  файлах  на две в  отношении  один  к  одному – поля с  атрибутами для   различных  манипуляций  и  сам  блоб  (с  полем  ключа)  и  обращатся   к  нему  только  при  выборке  бинарных  данных.   В  Mysql  таблицы  -   отдельные   файлы размер  блобов на   быстродействии  не   скажется.  В  других  БД  можно  выносить  таблицы   с  блобами  в  отдельные   tablespace файлы  который   можно  разместить  вообще   на  другом  винчестере.
      Единственный   минус, что  касается картинок  для   вэба,  это то  что  картинки  апач  будет  читать не  прямо  с  диска    а   из  БД  посредством  выполнения  php  скрипта,  что  создаст  дополнительную  нагрузку  на  проц,  что,  правда,  компенсируется  более  быстрым  доступом  к самому   файлу,  потому  как  БД  более  оптимизированны  для   поиска  данных  чем  файловая  системма. 
         Наиболее   удобный   вариант,  конечно  поля  типа  FILESTREAM  как   в  MSSQL2005.   С   одной  стороны    запись  с  транзакционной  таблице  а  с  другой  стороны  фактически на   файловой   системе в  оптимизированных  для   поиска  и   выборке структурах.

       

  • Creator
    1 марта 2011, 12:58

    @ leon:
    а попробуйте хранить в БД большие архивы или фильмы? Думаю, что на долго БД не хватит либо обслуживание такой БД выльется в копеечку=)

    На самом деле существует очень немного ситуаций, когда хранение файлов в БД рентабельно.

  • 7 мая 2011, 3:50

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

  • 1 августа 2011, 8:29

    Хранение больших изображений таки влетает в копеечку. Естественно лучше применить другие сервизы, например мировой журнал.

Оставьте ваш комментарий