#database #io #rdbms
#База данных #io #СУБД
Вопрос:
Я понимаю, что блок является фундаментальным физическим элементом FS и СУБД. Как система управления реляционными базами данных, такая как MySQL или Oracle, хранит данные своих блоков, а затем загружает их в память? Использует ли она файловую систему? Метод поиска? Или просто голый ввод-вывод, как файловая система?
Я везде искал ответ и не нашел ответа, хотя я уверен, что блочное хранилище — это то, о чем многие должны знать, глядя на количество реализаций.
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ: просто чтобы уточнить, я хочу знать, как СУБД фактически реализует этот блок в хранилище. Использует ли она кластеры файловой системы или вообще обходит FS?
Ответ №1:
Я ничего не знаю о том, как MySQL и Oracle хранят данные, однако я могу дать некоторое представление о том, как работает Microsoft SQL Server
В SQL Server основной единицей хранения является страница размером 8 КБ. Все хранится в виде блоков размером со страницу, и почти вся память также организована и распределена в этих блоках размером 8 КБ. Например, все следующее хранится в pages:
- Данные в таблицах
- Индексы
- Планы выполнения
Всякий раз, когда используется страница, ее необходимо загружать в память и сохранять загруженной до тех пор, пока SQL Server не закончит работу с этой страницей, однако, когда работа завершена, она не просто отбрасывается, вместо этого SQL Server пытается буферизировать как можно больше страниц в памяти, и поэтому страница вместо этого находится в буферном пуле- список страниц, которые все еще находятся в памяти, однако доступны для повторного использования, если это необходимо (удаление и последующее использование при доступе к другой странице).
SQL Server отслеживает, какие страницы доступны в буферном пуле, чтобы по возможности избежать чтения или записи на диск — существует сложный набор правил, определяющих, когда страница перепрофилируется (включая «отложенную запись» любых грязных страниц на диск, если были внесены какие-либо изменения), чтобы попытатьсяи сохраняйте часто используемые страницы в памяти и минимизируйте промахи в кэше. По сути, SQL Server постоянно пытается использовать как можно больше памяти, не вызывая сбоев страницы ОС.
Что касается того, как он узнает, какие страницы загружать, это в основном индексирование с понижением — индексы (которые также хранятся на страницах) структурированы таким образом, что SQL Server может перемещаться по индексу и находить соответствующую запись в индексе (в зависимости от запроса) с минимальным количеством операций чтения. Затем индекс содержит ссылки, информирующие SQL Server о том, какие страницы содержат фактические данные.
Это огромное упрощение, однако оно должно, по крайней мере, дать общее представление о том, как все работает. Если вам интересно узнать больше, я рекомендую страницу Википедии о SQL Server, в частности раздел «Хранение данных». Существует также ряд книг по внутренней части SQL Server, которые я нахожу очень информативными.