ENIGMA AI
ENIGMA AI

Чем отличается обычный B-Tree индекс от полнотекстового индекса?

встречается 1× SQL middle database

Как ответить

Главное отличие — в структуре хранения и алгоритме поиска. B-Tree индекс хранит данные в сбалансированном дереве, где каждый узел — отсортированный набор ключей, и поиск идёт по полному совпадению, префиксу или диапазону. Полнотекстовый индекс строит инвертированный список (inverted index): для каждого слова (токена) хранится список документов и позиций вхождений.

Вот основные практические различия:

  • B-Tree работает с точными значениями, частичными совпадениями по левому краю (like 'abc%') и диапазонами. Полнотекстовый — для поиска по словам, фразам, стеммингу (приведение к основе слова), поиска с учётом морфологии и релевантности.
  • Стемминг и нормализация. В MySQL с MyISAM/InnoDB (FULLTEXT) по умолчанию работает стеммер для английского (можно отключить). В PostgreSQL (tsvector/tsquery) нужно конфигурировать словарь и язык.
  • Стоп-слова. Полнотекстовый индекс может игнорировать короткие или частые слова (артикли, предлоги), что в B-Tree вы делали бы через много OR/AND условий, которые плохо оптимизируются.
  • Релевантность. В полнотекстовом индексе можно ранжировать результаты по TF-IDF или BM25. B-Tree выдаёт только набор строк, удовлетворяющих условию.
  • Размер и производительность. B-Tree индекс в разы компактнее, вставка/обновление быстрее. Полнотекстовый индекс растёт быстро: для каждого слова хранятся списки. На больших текстах (поле varchar(1000) в 10 млн строк) он может весить как сама таблица.

Пример, где они друг без друга не справляются. Допустим, ищем «быстрые решения для миграции на PostgreSQL»:

-- B-Tree сделает only 'быстрые решения для миграции%' — не подходит, нет точного совпадения.
-- Полнотекстовый (PostgreSQL):
SELECT *
FROM docs
WHERE to_tsvector('russian', content) @@ to_tsquery('russian', 'быстр & решени & миграц');
-- Или с левым совпадением по заголовку, если заголовок уникален:
SELECT *
FROM docs
WHERE title LIKE 'быстрые решения%'
  AND to_tsvector('russian', content) @@ to_tsquery('russian', 'миграц');
-- B-Tree на title, полнотекстовый на content — комбинированное использование.

Таким образом, выбор индекса зависит от задачи: B-Tree хорош для точного поиска и сортировки, полнотекстовый — для поиска по тексту с учётом морфологии и релевантности.

Ключевые тезисы

  • B-Tree — сбалансированное дерево с точным/диапазонным поиском. Полнотекстовый — инвертированный список для поиска по словам и фразам.
  • В полнотекстовом индексе используется стемминг, стоп-слова и ранжирование (TF-IDF/BM25).
  • B-Tree компактнее и быстрее на вставку, полнотекстовый может весить как сама таблица на текстовых полях.
  • Часто используются вместе: B-Tree на заголовок/дату, полнотекстовый на тело документа.
  • Важно различать реализации: MySQL FULLTEXT (свои настройки стоп-слов) vs PostgreSQL tsvector + словари.

Что спросят дальше

  • — Как бы ты выбирал между кластеризованным B-Tree и некластеризованным для таблицы с полнотекстовым поиском?
  • — Как в MySQL/PostgreSQL влияет стоп-слова и длина слова на полнотекстовый индекс при частичных совпадениях?
  • — Что произойдёт с планом запроса, если в WHERE есть одновременно обычный и полнотекстовый индекс на разные колонки?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение