PostgreSQL: индексы GIN или GiST? - PullRequest
38 голосов
/ 22 августа 2008

Исходя из информации, которую я смог найти, они оба решают одни и те же проблемы - более эзотерические операции, такие как удержание массивов и пересечение (&&, @>, <@ и т. Д.). Однако мне было бы интересно получить совет о том, когда использовать один или другой (или ни один из них возможно). <br> Документация PostgreSQL содержит информацию об этом:

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

Однако мне было бы особенно интересно узнать, не влияет ли это на производительность, когда соотношение размера памяти к индексу начинает уменьшаться (т. Е. Размер индекса становится намного больше доступной памяти)? Мне сказали на IRC-канале #postgresql, что GIN должен хранить весь индекс в памяти, иначе он не будет эффективным, потому что, в отличие от B-Tree, он не знает, какую часть считать с диска для конкретный запрос? Возникает вопрос: так ли это (потому что мне тоже говорили об этом)? Есть ли у GiST такие же ограничения? Существуют ли другие ограничения, о которых я должен знать при использовании одного из этих алгоритмов индексации?

1 Ответ

15 голосов
/ 25 августа 2008

Прежде всего, нужно ли их использовать для индексации текстового поиска? GIN и GiST являются индексами, специализированными для некоторых типов данных. Если вам нужно индексировать простые значения типа char или integer, тогда лучше всего использовать обычный индекс B-Tree.
В любом случае, в документации PostgreSQL есть глава по GIST и по GIN , где вы можете найти больше информации.
И, наконец, что не менее важно, лучший способ найти лучший из них - это сгенерировать выборочные данные (столько, сколько нужно для реального сценария), а затем создать индекс GIST, измеряя, сколько времени требуется для создания индекса вставить новое значение, выполнить пример запроса. Затем удалите индекс и сделайте то же самое с индексом GIN. Сравните значения, и вы получите ответ, который вам нужен, основываясь на ваших данных.

...