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

PostgreSQL: индексы GIN или GiST?

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

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

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

4b9b3361

Ответ 1

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