Какие альтернативы B-дереву (B-tree) для индексов в базах данных ты знаешь?

«Какие альтернативы B-дереву (B-tree) для индексов в базах данных ты знаешь?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

B-дерево и его вариант B+дерево — это стандарт для индексов в реляционных СУБД, оптимизированный для сбалансированных операций чтения/записи на диске. Однако для специфичных сценариев используются другие структуры:

1. Хеш-индекс (Hash Index)

  • Принцип: Использует хеш-таблицу. Идеально подходит для поиска по точному совпадению (WHERE key = value).
  • Плюсы: Сложность поиска O(1) в среднем.
  • Минусы: Не поддерживает диапазонные запросы (BETWEEN, >, <), частичное совпадение или сортировку по ключу.
  • Где используется: InnoDB в MySQL для адаптивных хеш-индексов в памяти, некоторые NoSQL-хранилища.

2. LSM-дерево (Log-Structured Merge-Tree)

  • Принцип: Оптимизировано для очень высокой скорости записи. Записи сначала добавляются в упорядоченную структуру в памяти (memtable), затем сбрасываются на диск в SSTable-файлы, которые периодически мержатся.
  • Плюсы: Превосходная производительность записи, часто лучше сжатие.
  • Минусы: Чтение может быть медленнее (проверка нескольких уровней), требуется компрессия.
  • Где используется: Cassandra, RocksDB (под капотом у многих систем, включая MySQL MyRocks), LevelDB.

3. R-дерево (R-tree) и его варианты (GiST, SP-GiST)

  • Принцип: Пространственный индекс для многомерных данных (географические координаты, полигоны).
  • Где используется: PostgreSQL (типы данных geometry, geography), GIS-системы.

4. Инвертированный индекс (Inverted Index)

  • Принцип: Используется для полнотекстового поиска. Сопоставляет слова (токены) с документами, в которых они встречаются.
  • Где используется: PostgreSQL (tsvector), Elasticsearch, специализированные поисковые движки.

5. Bitmap-индекс

  • Принцип: Для каждого уникального значения столбца создается битовая карта строк. Эффективен для столбцов с низкой кардинальностью (пол, статус).
  • Плюсы: Очень эффективен для сложных запросов с AND/OR над несколькими такими индексами.
  • Минусы: Дорого обновлять при частых INSERT/UPDATE/DELETE.
  • Где используется: Чаще в колоночных хранилищах данных (OLAP) и системах бизнес-аналитики.