Подтвердить что ты не робот

Какая разница между методами индекса B-Tree и GiST (в PostgreSQL)?

Недавно я работал над оптимизацией баз данных Postgres, и традиционно я использую только индексы B-Tree. Тем не менее, я видел, что индексы GiST поддерживают неспецифические, многоколоночные индексы в документации Postgres 8.3.

Я не мог, однако, понять, какова фактическая разница между ними. Я надеялся, что мои коллеги-программисты смогут объяснить, каковы плюсы и минусы между ними, и что еще более важно, причины, по которым я буду использовать один за другим?

4b9b3361

Ответ 1

Вкратце: индексы B-Tree работают лучше, но индексы GiST более гибкие. Обычно вам нужны индексы B-Tree, если они будут работать для вашего типа данных. Недавно в списках PG была опубликована заметка об огромном успехе использования индексов GiST; ожидается, что они будут медленнее, чем B-деревья (такова цена гибкости), но не намного медленнее... работа, как и следовало ожидать, продолжается.

Из сообщение Tom Lane, основного разработчика PostgreSQL:

Основной темой GIST является возможность индексирования запросов, которые просто не индексируется в btree.... Можно было бы полностью ожидают, что btree вычеркнет GIST для случаев с индексом btree. я думаю Существенным моментом здесь является то, что он выигрывает в два раза сто; это довольно ужасно и может указывать на некоторую реализацию проблема.

Ответ 2

В принципе все справа - btree - индекс по умолчанию, поскольку он работает очень хорошо. GiST - это несколько разные звери - это скорее "каркас для записи типов индексов", чем собственный тип индекса. Вы должны добавить собственный код (на сервере), чтобы использовать его, но, с другой стороны, они очень гибкие.

Как правило, вы не используете GiST, если только тип данных, который вы используете, не говорит вам об этом. Пример типов данных, которые используют GiST: ltree (from contrib), tsvector (contrib/tsearch до 8.2, в ядре с 8.3) и другие.

Существует хорошо известное и довольно быстрое географическое расширение PostgreSQL - PostGIS (http://postgis.refractions.net/), которое использует GiST для своих целей.

Ответ 3

Индексы GiST в некоторой степени убывают, что означает, что СУБД приходится иметь дело с ложными срабатываниями/негативами, то есть:

Индексы GiST являются потерями, поскольку каждый документ представлен в индексе фиксированным числом,. Подпись генерируется путем хэширования каждого слова в случайный бит в n-битовой строке, с все эти биты OR-ed вместе производят n-разрядную подпись документа. Когда хеш двух слов с одним и тем же битом положение будет ложным совпадением. Если все слова в запросе совпадают (реальный или ложный), то строка таблицы необходимо найти, чтобы убедиться, что совпадение верно. b-деревья не имеют такого поведения, поэтому в зависимости от индексируемых данных может быть разница в производительности между ними.

Посмотрите на поведение текстового поиска http://www.postgresql.org/docs/8.3/static/textsearch-indexes.html и http://www.postgresql.org/docs/8.3/static/indexes-types.html для сравнения общего назначения.

Ответ 4

GiST - более общие индексы. Вы можете использовать их для более широких целей, чем те, которые вы будете использовать с B-Tree. Включая возможность построения B-Tree с помощью GiST.

IE: вы можете использовать GiST для индексирования по географическим точкам или географическим регионам, что вы не сможете сделать с индексами B-Tree, поскольку единственное, что имеет значение на B-дереве, - это ключ (или ключи), на которые вы индексируете.