В чем разница между методами B-Tree и GiST index (в PostgreSQL)?

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

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

4 ответов


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

с сообщение Тома Лейна, ядро PostgreSQL разработчик:

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


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

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

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


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

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

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


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

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