Базы данных

Хранение данных и индексирование

Подсистема хранения данных

Содержание

Структура

Содержание

Типы памяти

Тип Характеристика Величина
Оперативная память Объем 16−256 ГБ
Цена ~2-3 $/ГБ
Быстродействие ~100+ ГБ/c
Время доступа 1−10 μ/c
SSD Объем 1−16 ТБ
Цена ~0.1 $/ГБ
Быстродействие 0.500−6 ГБ/c
Время доступа 0.1−0.2 мс
Жёсткие диски Объем 4−20 ТБ
Цена 0.03 $/ГБ
Быстродействие 10−200 МБ/c
Время доступа 5−100 мc

Особенности жёстких дисков

  • Большое время поиска
  • Скорость чтения
    • Последовательный доступ – средняя
    • Случайный доступ – низкая
  • Сократить число обращений
    • Сделать их последовательными

Страницы памяти

  • Память разбита на равные страницы
    • Прямое отображение в память
    • Загрузка и выгрузка всей страницы
    • Для IA32 и AMD64 обычно 4КБ, 2МБ или 4МБ
  • Обработка быстрее чем чтение
  • Последовательности страниц
    • Данные одного типа
    • Частые переходы к следующей/предыдущей странице
    • Желательно хранить последовательно

Доступ к данным

Модули системы хранения

  • Диспетчер диска
    • Каталог страниц
    • Оптимизация последовательностей страниц
  • Диспетчер страниц
    • Доступ к страницам
    • Распределение памяти
    • Выгрузка данных
  • Диспетчер записей
    • Доступ к записям

Организация данных

Содержание

Организация данных

  • Файл – одна или несколько таблиц
  • Таблица – несколько страниц
  • Страница – несколько записей
  • Какие проблемы?
    • Записи длиннее страницы

Список страниц

  • Диспетчер диска – последовательности
  • Диспетчер памяти – предвыборка

Идентификатор записи

  • Id записи (RID)
    • Id страницы
    • Id записи на странице
  • Используется во многих местах
    • Не должен меняться
  • Как хранить данные страницы?

Записи на странице

  • Что делать, когда записи не помещаются?

Страницы переполнения

  • Как избежать цепочек?
    • Изменять ссылки на исходной странице

Сжатие данных

  • Данные на страницах можно сжимать
    • Больше вычислений
    • Меньше ввода-вывода
    • Часто – быстрее
  • Использование структуры данных
    • Сжатие по полям
    • Инкрементальное сжатие
    • Префиксное сжатие

Зачем нужна индексация?

  • Несколько миллионов+ записей
  • Как найти нужную?
    • Полный просмотр таблицы
    • Индексация: поиск в структуре данных

Полный просмотр таблицы

  • Последовательный перебор записей
  • Размер таблиц
    • Большие и средние – медленно
    • Маленькие – быстро
  • Количество выбираемых данных
    • Малая доля – медленно
    • Бóльшая часть – быстро

Индекс

  • Набор столбцов
    • Не обязательно ключ
  • Предварительная обработка
    • При построении
    • При обновлении
  • Быстрый поиск в индексе
    • Указатель на запись

Структура индекса

  • Почему не хранить данные в порядке индекса?

Кластеризованный индекс

  • Выше скорость просмотра
  • Упорядоченность
  • Может быть только один

Хэш-индекс

  • Предварительная обработка
    • Подсчёт хэшей ключей
    • Разбиение на корзины
  • Поиск в индексе
    • Просмотр корзины
    • Несколько ключей в корзине
  • Заголовок помещается в памяти

Простой хэш-индекс

  • Что делать, если корзина не помещается на страницу?

Последовательности страниц

  • Линейное время поиска
  • Что делать с большими корзинами?
    • Перехэширование очень дорого

Расширяемое хэширование

  • Большое количество корзин
  • Несколько корзин на одной странице
    • Обычно – последовательных
    • Разделение корзин при переполнении страницы
  • При плохой хэш-функции – не поможет

Побитное расш. хэширование

  • Глубина хэша $n$
    • $2^n$ корзин
  • Локальная глубина страницы $k$
    • $2^{n-k}$ корзин на странице
    • Может быть разной
  • Разделение корзин
    • Страница глубины $k$ разделяется на две глубины $k + 1$

Ускоряемые запросы

  • Проверка существования ключа
    • Проверка повторений (ключи)
    • in
    • exist
    • count
  • Поиск по ключу
    • Естественные соединения
    • join using

Упорядоченные индексы

Содержание

Упорядоченные индексы

  • Предварительная обработка
    • Ключи упорядочиваются по возрастанию
  • Поиск в индексе
    • Поиск в упорядоченной последовательности
  • Требуемые операции
    • Вставка
    • Удаление
    • Быстрый поиск
  • Какую структуру данных использовать?
    • Деревья поиска

Деревья поиска

  • Количество операций
    • $O(высота)$
    • Минимизировать высоту
  • Размер узла
    • Размер страницы
    • ⇒ Сильно ветвящиеся

B и B+ -деревья

  • $B$ деревья степени $n$
    • От $n/2$ до $n$ детей
    • Указатели и ключи хранятся в узлах
  • $B^+$ деревья степени $n$
    • От $n/2$ до $n$ детей
    • Указатели хранятся в листьях
  • Сравнение
    • В $B^+$ меньше данных в узлах – сильнее ветвятся
    • $B^+$ на одну страницу глубже
  • Корень и несколько первых уровней – в памяти

Плотные и разреженные

  • Плотный индекс
    • Ключи всех записей
  • Разреженный индекс
    • Кластеризованный
    • Ключи части записей
    • Обычно – один на страницу
  • Частичный индекс
    • Ключи части записей
    • Выбираются по условию

Данные и индексация

  • Строки
    • Много данных в ключе – меньше степень ветвления
    • Можно использовать префиксы
  • Суррогатные ключи
    • Малый размер
    • Неизменяемые
    • ⇒ Высокая эффективность
  • Изменяющиеся данные
    • Частое обновление индекса
    • Число чтений ≫ изменений

Ускоряемые запросы

  • Проверка существования ключа
  • Поиск по ключу
  • Минимум и максимум
  • Диапазон
    • Загрузка
    • count
  • like по префиксу
    • name like 'M343%'
      

Другие типы индексов

Содержание

Пример битового индекса

Битовый (bitmap) индекс

  • По одному биту на каждое возможное значение
    • Хранятся битовые маски
    • По столбцам
  • Ускоряемые запросы
    • Логические выражения
    • count
  • Долгое обновление

Многозначный битовый индекс

Битовый индекс с накоплением

Составной битовый индекс

Запрос по битовому индексу

  • Gender = 'М' and Year >= 3
  • М and 3

Оптимизация битового индекса

  • Часто целиком помещаются в памяти
  • Сжатие индекса
    • RLE-кодирование
    • Byte-aligned Bitmap Code – логические операции без распаковки
    • Сложность перестроения
  • Создание корзин
    • Склеивание некоторых значений
  • Оцените размер сжатого битового индекса
    • Число записей × число полей

Пример R-дерева

  • Составные индексы

R-деревья

  • Разбиение данных на параллелепипеды
    • Минимальные охватывающие
  • Ускоряемые запросы
    • Диапазоны по нескольким координатам
    • Поиск ближайших значений

Применение индексов

Содержание

Выбор типа индекса

  • Поиск по (Фамилия, Имя)
  • Хэш индекс
    • Компактный
    • Поиск только по фамилии
  • Упорядоченный индекс
    • Поиск по фамилии
    • Поиск по префиксу
    • Возможность использования диапазонов
    • Индекс на строках

Селективность индекса

  • Насколько хорошо индекс «раскидывает» данные
    • Процент записей, получаемых по значению
    • count distinct / count – среднее
    • max count / count – худшее
  • Примеры
    • Номер паспорта – высокая селективность
    • Возраст человека – средняя селективность
    • Пол человека – низкая селективность

Оценка селективности

  • Статистика
    • Предыдущие запросы
    • Специальный подсчёт
  • Хэш-индексы
    • Размеры и количество корзин
  • $B$-деревья
    • Верхние уровни – гистограмма распределения
  • При низкой селективности индекс не используется

Покрывающий индекс

  • В индексе есть все требуемые столбцы
    • Не требуется загрузка записи
  • Дополнительные столбцы индекса
    • По которым индексация не требуется
    • Увеличение размера индекса

Рекомендации

  • Индексы на ключи
  • Индексы на внешние ключи
  • Индексы на запросы по диапазонам
  • Индексы таблиц связей
    • Упорядоченные индексы на ($id_1$, $id_2$) и ($id_2$, $id_1$)
  • Индексы на строки
    • Только для массовых операций над строками

Индексы и SQL

  • При определении таблицы
    • index {имя} {unique|sparse|..} 
      [using метод] (столбцы)
      
  • После определения таблицы
    • create {unique|sparse|..} index {имя} on таблица 
      [using метод] (столбцы)
      
  • Частичные индексы
    • where условие
      
  • Удаление индекса
    • drop index {name}
      

Литература

Содержание

Основная литература

  • Дейт К. Введение в системы баз данных (Приложение Г)

Дополнительная литература

  • Кнут Д. Искусство программирования. Том 3. Сортировка и поиск
  • Silberschatz A., Korth H. F., Sudarshan S. Database System Concepts