Что на самом деле делает база данных, чтобы узнать, что соответствует оператору select?
Откровенно говоря, это вопрос грубой силы. Просто он читает каждую запись кандидата в базе данных и сопоставляет выражение с полями. Итак, если у вас есть «select * from table where name = 'fred'», он буквально проходит через каждую запись, берет поле «name» и сравнивает его с 'fred'.
Теперь, если поле «table.name» проиндексировано, то база данных будет (вероятно, но не обязательно) сначала использовать индекс, чтобы найти записи-кандидаты, к которым будет применяться фактический фильтр.
Это уменьшает количество записей-кандидатов, к которым нужно применить выражение, в противном случае оно будет просто выполнять то, что мы называем «сканированием таблицы», то есть читать каждую строку.
Но по сути, как бы то ни было, он находит записи-кандидаты отдельно от того, как он применяет фактическое выражение фильтра, и, очевидно, есть несколько умных оптимизаций, которые могут быть выполнены.
Как база данных интерпретирует соединение иначе, чем запрос с несколькими операторами «where key1 = key2»?
Итак, объединение используется для создания новой «псевдотаблицы», к которой применяется фильтр. Итак, у вас есть критерии фильтрации и критерии присоединения. Критерии объединения используются для построения этой «псевдотаблицы», а затем к ней применяется фильтр. Теперь при интерпретации соединения это снова та же проблема, что и с фильтром - сравнения грубой силы и чтение индекса для построения подмножества для «псевдотаблицы».
Как база данных хранит всю свою память?
Один из ключей к хорошей базе данных - это то, как она управляет своими буферами ввода-вывода. Но в основном он сопоставляет блоки RAM с блоками диска. С современными диспетчерами виртуальной памяти более простая база данных может почти полагаться на виртуальную машину в качестве диспетчера буфера памяти. Высококачественные DB делают все это сами.
Как хранятся индексы?
B + Деревья обычно, вы должны поискать это. Это простая техника, которая существует уже много лет. Это преимущество характерно для большинства сбалансированных деревьев: согласованный доступ к узлам, плюс все конечные узлы связаны, поэтому вы можете легко переходить от узла к узлу в ключевом порядке. Таким образом, с индексом строки можно считать «отсортированными» по определенным полям в базе данных, и база данных может использовать эту информацию для оптимизации. Это отличается, скажем, от использования хеш-таблицы для индекса, которая позволяет быстро перейти только к определенной записи. В B-дереве вы можете быстро перейти не только к конкретной записи, но и к точке в отсортированном списке.
Фактический механизм хранения и индексации строк в базе данных действительно довольно прост и понятен. Игра управляет буферами и преобразует SQL в эффективные пути запросов для использования этих основных идиом хранения.
Кроме того, к идиоме хранилища добавляется вся сложность многопользовательского режима, блокировки, ведения журнала и транзакций.