В интернетах бытует мнение, что хранить файлы в БД — школоло. Разрушаем стереотип с Mongo GridFS.
Введение:
MongoDB предоставляет возможность хранить файлы любого размера в Mongo GridFS
Для драйвера PHP — это обычная коллекция, в которой есть поле для хранения бинарных данных.
Бинарные данные в свою очередь разбиваются на чунки(небольшие куски).
Бинарные данные можно извлечь как целиком, так и почунково(это экономит память).
Плюсы хранения данных в БД MongoDB:
MongoDB может хранить миллионы файлов в БД, хранение такого объёма данных в файловой системе может вызвать проблемы(начиная с IO проблем, заканчивая проблемами доступа к данным из разных серверов).
MongoDB реплицирует данные на все сервера, что упрощает доступ к данным на отдельно взятом сервере.
Нет проблем с бекапами и целостностью данных на разных серверах. надёжность обеспечивается MongoDB.
К загруженному файлу можно прикрепить метаданные (описание, комментарии, лайки, и.т.д.)
Т.к. файлы хранятся в чунках — можно работать с любой частью файла.
Минусы:
Быстродействие ниже, чем nginx + файловая истема. Сравним:
nginx + файловая система, получаем 6559.31 операций в секунду
apache + файловая система: получаем 2625.37 операций в секунду
nginx + модуль nginx-gridfs, получаем 1083.88 операций в секунду
Вывод: nginx + fs на высоте, но это решение не даёт масштабируемости и гибкости.
nginx + nginx-gridfs даёт приличные результаты, которые существенно возрастут, при использовании нескольких серверов MongoDB.
Благодарность, http://tokarchuk.ru за тесты.
первый раз осилил многобукаф в названии поста, собственно продолжим.
если вы линупсоид,выполните
ab -c 100 -n 10000 http://мой_сайт.ru/ |
Эта команда выполнит лёгенький ддос на ваш сайт(10000 запросов суммарно по 100 запросов параллельно) =)
что интересного можно узнать из результата:
Ну вот, кроме всяких скоростей есть поле failed requests. Это количество ошибок. Если их нет, то хорошо.
Естественно такие данные как ниже вас должны ввергать в неконтроллируемый страх и ужос, как и повёл себя товарищ пилящий =)
Как выжать из нашей ласточки всё по максимуму?
1. Как показывает практика, можно увеличить скорость работы запросов в 10-15 раз, составив правильный индекс на таблицы. Проанализируйте основные свои запросы к базе данных и составьте индекс из всех полей, которые являются критериями выборки.
Например, вы обнаружили что очень много подобных запросов:
select * from price_items_params where price_item_id=1 and price_param_group=’Наличие в магазине’ and price_param_name=’РВ’
в таких случаях рекомендуется повесить на таблицу price_items_params составной индекс из полей price_item_id, price_param_group, price_param_name.
Ну, и не делайте поля типа Text(по возможности) они неопределённой длины, что затрудняет работу с ними.