Недостатки наличия (потенциально) тысяч каталогов на сервере вместо базы данных?

StackOverflow https://stackoverflow.com/questions/1220965

Вопрос

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

Что я имею в виду:Вместо того, чтобы иметь базу данных, в которой хранится таблица blog, тогда есть строка, содержащая "author", "message" и "date", я бы вместо этого имел:Папка для конкретного сообщения, затем файлы * .txt внутри этой папки, в которых хранятся "автор", "сообщение" и "дата".

Это было полезно?

Решение

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

Базы данных оптимизированы и предназначены для обработки таких больших объемов структурированных данных. Файловых систем нет. Было бы ошибкой пытаться реплицировать базу данных с файловой системой. В конце концов, вы можете индексировать столбцы базы данных, но сложно проиндексировать файловую систему без другого инструмента.

Базы данных созданы для быстрого доступа к данным и их поиска. Файловые системы созданы для хранения данных. Используйте правильный инструмент для работы. В данном случае это абсолютно база данных.

При этом, если вы хотите создать HTML-файлы для постов, а затем сохранить эти локали в БД, чтобы вы могли легко получить к ним доступ, то это определенно хорошее решение (в стиле Movable Type).

Но если вы храните эти вещи в файловой системе, как вы можете найти свой последний пост? Самый плодовитый автор? Самый спорный автор? Все это тривиально с базой данных, и очень сложно с файловой системой. Придерживайтесь базы данных, вы будете рады, что сделали.

Другие советы

Это действительно зависит:

  • Каков размер файла
  • Какие требования к долговечности у вас есть?
  • Сколько обновлений вы выполняете?
  • Что такое файловая система?

Не очевидно, что MySQL был бы быстрее:

Я сделал однажды такое сравнение для маленький объект для того, чтобы использовать его в качестве хранилища сеансов для CppCMS.С одним индексом (только ключ) и двумя индексами (первичный ключ и вторичный тайм-аут).

File System:   XFS     ext3 
-----------------------------
Writes/s:      322     20,000

Data Base \  Indexes:    Key Only   Key+Timeout
-----------------------------------------------
Berkeley DB              34,400      1,450
Sqlite No Sync            4,600      3,400
Sqlite Delayed Commit    20,800     11,700

Как вы можете видеть, с помощью simple Ext3 файловая система была быстрее или так же быстра, как Sqlite3 для хранение данные, потому что они не дают вам (D) КИСЛОТЫ.

С другой стороны...DB предоставляет вам множество важных функций, которые вам, вероятно, понадобятся, поэтому Я бы не рекомендовал использовать файлы в качестве хранилища, если вам это действительно не нужно.

Помните, что DB - это не всегда бутылочное горлышко системы

Забудьте о длинных ответах, вот самые простые причины, по которым хранение данных в незашифрованных файлах - плохая идея:

<Ол>
  • Практически невозможно запросить. Как бы вы отсортировали сообщения в блогах по дате? Вам нужно будет прочитать все файлы и сравнить их дату или сохранить свой собственный индексный файл (в основном, написать свою собственную систему базы данных.)

  • Это кошмар для резервного копирования. tar cjf его не обрежет, и если вы попытаетесь, у вас может получиться несовместимый снимок.

  • Вероятно, есть еще дюжина веских причин не использовать файлы, трудно отслеживать производительность, очень сложно отлаживать, почти невозможно восстановить в случае ошибки, нет инструментов для их обработки и т. д. ...

    Я думаю, что ключевым моментом здесь является отсутствие индексации ваших данных. Таким образом, поиск чего-либо, скажем, поиска будет слишком медленным по сравнению с индексированной базой данных. Кроме того, операции ввода-вывода являются дорогостоящими, база данных может (частично) находиться в памяти, что делает данные доступными намного быстрее.

    Вы действительно не говорите, почему вы не будете использовать базу данных самостоятельно ... Но в сценарии, который вы описываете, я бы определенно использовал БД поверх папки в любой день по нескольким причинам. Прежде всего, сценарий блога кажется очень простым, но очень легко представить, что вы когда-нибудь захотите расширить его, добавив больше функций, таких как поиск, больше записей, категорий и т. Д.

    Я думаю, что выращивание модели будет сложнее сделать в структуре папок, чем в БД.

    Кроме того, базы данных обычно НАМНОГО быстрее, чем доступ к файлам, из-за индексации и кэширования памяти.

    IIRC Fudforum использовал файловое хранилище по соображениям скорости, захват файла может быть намного быстрее, чем поиск по индексу базы данных, извлечение данных из базы данных и отправка их пользователю.Вы обмениваете интерфейс файловой системы с интерфейсами DB и DB-library.

    Однако это не значит, что это будет быстрее или медленнее.Я думаю, вы обнаружите, что запись происходит быстрее в файловой системе, но чтение быстрее в базе данных по общим вопросам.Если, как и в fudforum, у вас есть относительно неизменяемые данные, которые вы хотите отображать несколькими публикациями в одной, то подход на основе файлов может быть намного быстрее:например, им не нужно искать каждое связанное сообщение, они помещают все это в 1 текстовый файл и отображают его один раз.Если вы сможете применить такого рода оптимизацию, то ваш подход, основанный на файлах, будет работать.

    Кроме того, почтовые серверы также работают на основе файлового подхода, формат Maildir хранит каждое электронное сообщение в виде файла в каталоге, а не в базе данных.

    однако я бы сказал одну вещь: вам будет лучше хранить все в 1 файле, а не в 3.Файловая система лучше справляется с чтением (и кэшированием) одного файла, чем с несколькими.Поэтому, если вы хотите сохранить каждое сообщение в виде 3 частей, сохраните их все в одном файле, прочитайте его, чтобы получить любую из частей, и просто отобразите ту, которую вы хотите показать.

    ... а затем вы хотите выполнить поиск по всем сообщениям автора, и вы получите возможность прочитать миллион файлов вместо простого запроса SQL ...

    Базы данных РАБОТАЮТ НЕ быстрее.Подумай об этом:В конце концов, они также хранят данные в файловой системе.Таким образом, вопрос о том, работает ли база данных быстрее, сильно зависит от пути доступа.

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

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

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

    Комментарий @Eric's:Это зависит от того, что вам нужно.Если вам нужно только точное содержимое файла для каждого запроса, и вы можете определить местоположение и имя файла детерминированным способом, прямой доступ осуществляется быстрее, чем то, что делает база данных, что примерно:

    • получите доступ к куче записей индекса, чтобы
    • получить доступ к куче строк таблицы (СУБД обычно считывают блоки, содержащие несколько строк), чтобы
    • выберите одну строку из блока.

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

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

    если вы предпочитаете отказываться от RDBMS, почему бы вам не попробовать другое значение ключа с открытым исходным кодом или БД документа (нереляционные БД) ..

    Из вашей публикации я понимаю, что вы не собираетесь следовать никаким ACID-свойствам реляционных БД. Было бы лучше адаптировать другие значения ключей dbs (mongodb, coutchdb или hyphertable) вместо вашей собственной реализации файловой системы. дать лучшую производительность, чем существующие подходы.

    Примечание: я также не являюсь экспертом в этом ... только начал работать над MongoDB и считаю полезным в подобных сценариях. просто хотел поделиться, если вы не знаете об этих подходах

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top