Разница между 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 делает это автоматически при необходимости.)
Жирный акцент мой.