Как базы данных на диске обрабатывают чтение и запись файлов на уровне файловой системы? - PullRequest
0 голосов
/ 26 февраля 2019

Предположим, я должен был написать свою собственную базу данных на c ++ и предположить, что я бы использовал двоичное дерево или хеш-карту в качестве базовой структуры данных.Как бы я справился с обновлениями этой структуры данных?

1) Должен ли я сначала создать двоичное дерево, а затем каким-то образом сохранить его на диске?И каждый раз, когда данные должны быть обновлены, мне нужно открыть этот файл и обновить его?Не будет ли это дорогостоящей операцией?

2) Есть ли способ напрямую работать с двоичным деревом, не загружая его в память и затем сохраняя снова?

3) Как SQLite и Mysql справляются с этим?

4) Мой главный вопрос: как базы данных сохраняют огромные объемы данных и одновременно обновляют их, не открывая и не закрывая файлкаждый раз.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Как правило, вы не будете выполнять файловый ввод-вывод для доступа к данным.Используйте mmap, чтобы отобразить данные в виртуальное адресное пространство процесса и позволить кешу блоков ОС позаботиться о чтении и записи.

0 голосов
/ 26 февраля 2019

Базы данных рассматривают диск или файл как одно большое устройство и управляют блоками в M-way Balanced Trees.Они вставляют / обновляют / удаляют записи в этих блоках и снова сбрасывают грязные блоки на диск.Они управляют таблицами размещения свободных блоков, поэтому нет необходимости переписывать базу данных при каждом доступе.Так как оперативная память дорогая, но быстрая, страницы хранятся в оперативной памяти.Отдельные индексы (отдельные файлы или просто блоки) управляют быстрым доступом на основе ключей.Блоки часто имеют собственный размер размещения базовой файловой системы (например, размер кластера).Журналы отмены / повтора сохраняются для атомарности.и т. д.

Намного больше предстоит рассказать, и этот вопрос фактически принадлежит бирже информатики.Для получения дополнительной информации прочитайте Horowitz & Sahni, «Основы структур данных», стр.496.

Что касается ваших вопросов:

  1. Вы открываете его один раз и держите открытым, пока вашменеджер баз данных работает.Вы распределяете хранилище по мере необходимости и поддерживаете M-way tree, как описано выше.

  2. Да.Вы читаете блоки, которые храните в кэше.

  3. и 4: см. Выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...