Разница между GiST и индексом GIN

Я реализую таблицу, которая имеет столбец с типом данных tsvector и я пытаюсь понять, какой индекс будет лучше использовать?

Джин или ГИСТ?

Просматривая документацию postgres здесь, я, кажется, понял:

  • GiST быстрее обновляет и создает индекс и менее точен, чем джин.

  • GIN медленнее обновляет и строит индекс, но более точен.

Хорошо, так зачем кому-то хотеть индексированное поле gist вместо gin? Если суть может дать вам неправильные результаты? В этом должно быть какое-то преимущество (внешнее исполнение).

Кто-нибудь может объяснить с точки зрения непрофессионала, когда я хотел бы использовать GIN против GiST?

1 ответ

Решение

Я не думаю, что мог бы объяснить это лучше, чем руководство уже делает:

При выборе типа индекса, GiST или GIN, учитывайте следующие различия в производительности:

  • Поиск в индексе GIN примерно в три раза быстрее, чем в GiST

  • Создание индексов GIN занимает в три раза больше времени, чем GiST

  • Индексы GIN обновляются умеренно медленнее, чем индексы GiST, но примерно в 10 раз медленнее, если поддержка быстрого обновления была отключена [...]

  • Индексы GIN в два-три раза больше, чем индексы GiST

Ссылка на текущее руководство, цитата из версии для 9.4, а ваша ссылка на версию 9.1 (по какой-то причине?).

Оценки размера и производительности в руководстве кажутся немного устаревшими - и с тех пор были удалены.
С Postgres 9.4 шансы существенно изменились в пользу GIN.
Примечания к выпуску Postgres 9.4 включают:

  • Уменьшить размер индекса GIN (Александр Коротков, Хейкки Линнакангас) [...]

  • Повышение скорости многоключевого поиска в GIN (Александр Коротков, Хейкки Линнакангас)

Обратите внимание, что существуют особые случаи использования, которые требуют одного или другого.

Одна вещь, которую вы неправильно поняли: вы никогда не получите неправильные результаты с индексом GiST. Индекс работает с хеш-значениями, что может привести к ложным срабатываниям в индексе. Это должно стать актуальным только с очень большим количеством разных слов в ваших документах. Ложные срабатывания удаляются после повторной проверки фактической строки в любом случае. Руководство:

Индекс GiST с потерями означает, что индекс может давать ложные совпадения, и необходимо проверить фактическую строку таблицы, чтобы исключить такие ложные совпадения. (PostgreSQL делает это автоматически при необходимости.)

Жирный акцент мой.

Другие вопросы по тегам