Основы БД
Основы БД
Хранение данных
Обычно БД хранят данные в файлах файловой системы, причем записывают новые данные только в конец. Это позволяет добиться хорошей производительности для записи, но для чтения придется перебирать полностью весь файл сначала (сложность О(n)).
Для улучшения производительности чтения, используют индексы
Типы индексов
Хэш-индексы
Для такого индекса в качестве ключа будет значение заданного индекса (например, по значениям одной колонки), а в качестве значения - относительный адрес (байтовое смещение) того, где находятся данные на диске.
Ограничения:
- Хэш-таблица должна помещаться в оперативной памяти, иначе сложно добиться хорошей производительности
- Неэффективные запросы по диапазону (напр., все записи между qwerty0000 и qwerty9999) - необходимое каждый ключ искать отдельно.
B-деревья
TODO
см. Кабанчик, страница 111
Способы хранения значений в индексах
По ссылке
В этом случае в качестве значения в индексе хранится только ссылка на значение. Сами значения при этом хранятся в неупорядоченном файле (heap file).
Это упрощает содержание нескольких вторичных индексов, так как не нужно перезаписывать значения в каждом, а лишь в heap файле.
С другой стороны, лишний переход от ссылки к значению может уменьшать производительность.
Кластеризованный индекс
(clustered index)
Проиндексированная строка хранится сразу в индексе. Это повышает скорость чтения, но увеличивает накладные расходы.
Пример: в MySQL первичный ключ является кластеризованным индексом, а все вторичные ссылаются на первичный ключ, а не на heap файл.
Охватывающий индекс
Охватывающий индекс (covering index) или индекс с включенными столбцами (index with included columns) - компромисс между кластеризованным и некластеризованным вариантами. В нем в индекс включаются лишь некоторые столбцы. Таким образом, можно покрыть индексом часть запросов.
Составные индексы
В случае, когда в запросе есть условия сразу по нескольким столбцам, одномерного индекса будет недостаточно. В этот случае используют составные (многомерные) индексы.
Чаще всего используется сцепленный индекс (concatenated index) - значения колонок просто присоединяются друг к другу (в порядке заданном индексом).