Как базы данных работают внутри страны?

Я работаю с базами данных в течение последних нескольких лет, и мне хотелось бы думать, что я достаточно компетентен с их использованием. Однако я недавно читал о Joel Закон утечек абстракций, и я понял, что хотя я могу написать запрос, чтобы получить почти все, что я хочу, из базы данных, я понятия не имею, как база данных фактически интерпретирует запрос. Кто-нибудь знает какие-либо хорошие статьи или книги, которые объясняют, как базы данных работают внутри страны?

Некоторые конкретные вещи, которые меня интересуют:

  • Что делает база данных на самом деле, чтобы узнать, что соответствует выражению select?
  • Как база данных интерпретирует соединение по-разному для запроса с несколькими операциями "where key1 = key2"?
  • Как база данных хранит всю свою память?
  • Как хранятся индексы?

Ответ 1

Что делает база данных на самом деле узнать, что соответствует выбранному утверждение?

Чтобы быть тупым, это вопрос грубой силы. Просто он читает каждую запись кандидата в базе данных и сопоставляет выражение с полями. Итак, если у вас есть "выберите * из таблицы, где name = 'fred", он буквально пробегает каждую запись, захватывает поле "имя" и сравнивает ее с "fred".

Теперь, если поле "table.name" индексируется, база данных (вероятно, но не обязательно) сначала использует индекс, чтобы найти записи кандидатов для применения фактического фильтра.

Это уменьшает количество записей кандидатов для применения выражения, иначе оно просто сделает то, что мы называем "сканирование таблицы", т.е. читаем каждую строку.

Но в принципе, однако, он находит записи кандидатов отдельно от того, как он применяет фактическое выражение фильтра, и, очевидно, есть некоторые умные оптимизации, которые можно выполнить.

Как база данных интерпретирует соединение по-разному с запросом с несколькими "where key1 = key2"?

Ну, соединение используется для создания новой "псевдо-таблицы", на которой применяется фильтр. Таким образом, у вас есть критерии фильтра и критерии соединения. Критерии присоединения используются для создания этой "псевдо-таблицы", а затем фильтр применяется к этому. Теперь, когда интерпретируется соединение, это снова та же проблема, что и сравнение фильтров - грубая сила, и индекс читает для построения подмножества для "псевдо таблицы".

Как база данных хранит все свои память?

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

Как хранятся индексы?

B + Деревья обычно, вы должны посмотреть его. Это простая техника, которая существует уже много лет. Это выгодно для большинства сбалансированных деревьев: последовательный доступ к узлам, плюс все узлы листа связаны, поэтому вы можете легко перемещаться с node до node в порядке очереди. Таким образом, с индексом строки можно считать "отсортированными" для определенных полей в базе данных, и база данных может использовать эту информацию для оптимизации. Это отличается от, скажем, использованием хеш-таблицы для индекса, что позволяет быстро перейти к определенной записи. В B-Tree вы можете быстро получить не только определенную запись, но и точку в отсортированном списке.

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

Затем существует сложная многопользовательская, блокирующая, протоколирующая и транзакционная сложность поверх идиомы хранения.

Ответ 2

  • Что делает база данных на самом деле, чтобы узнать, что соответствует выражению select?

    БД используют индексы (см. ниже)

  • Как база данных интерпретирует соединение по-разному для запроса с несколькими операциями "where key1 = key2"? Присоединение Операции могут быть переведены на двоичные операции дерева путем слияния деревьев.

  • Как база данных хранит всю свою память?

    файлы с памятью для более быстрого доступа к их данным

  • Как хранятся индексы?

    Внутренние БД работают с B-Trees для индексирования.

Это должно быть объяснено более подробно о википедии.

http://en.wikipedia.org/wiki/B-tree

http://en.wikipedia.org/wiki/Database

Ответ 3

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

Ответ 4

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

Я написал три попытки написать объяснение, но это действительно слишком большая тема. Проверьте статью Хеллерстайн (тот, что на сервере беркелей, с которым связан Саиф), а затем спросите о специфике.

Стоит отметить, что в любой данной СУБД реализуется только подмножество "известных хороших идей". Например, SQLite даже не делает хеш-соединения, он имеет только вложенные циклы (ack!!). Но тогда это легко встраиваемые dbms, и он делает свою работу очень хорошо, поэтому есть что сказать об отсутствии сложности.

Изучение того, как СУБД собирает статистику и как она использует их для построения планов запросов, а также изучение того, как читать планы запросов, в первую очередь, является неоценимым навыком - если вам нужно выбрать одну "внутреннюю базу данных" "тему, чтобы узнать, узнать это. Это сделает мир различий (и вы никогда не будете случайно писать декартово произведение снова...; -)).

Ответ 5

Если вы хотите узнать более подробно, я бы рекомендовал получить источники sqlite и посмотреть, как он это делает. Он завершен, хотя и не в масштабе крупных открытых источников и коммерческих баз данных. Если вы хотите более подробно узнать, я рекомендую "Полное руководство по SQLite" , которое является не только большим объяснением sqlite, но и одним из самые читаемые технические книги, которые я знаю. На стороне MySQL вы могли бы узнать из Блог эффективности MySQL, а также на книжном фронте O'Reilly Высокопроизводительный MySQL (V2), одним из авторов которого является блог.