Индексы GIN и GiST, как правило, больше простого b-дерева и требуют больше времени для сканирования. GIN быстрее, чем GiST за счет очень дорогих обновлений.
Если вы храните теги в столбце массива, то любое обновление для строки обычно требует обновления индекса в массиве. В некоторых случаях HOT разрешает это пропустить, но на это вы не можете положиться. Таким образом, у вас будет больше обновлений индекса и больше раздутий индекса.
С другой стороны, вы избегаете необходимости сканировать b-дерево для идентификаторов желаемых объектов, а затем извлекать их из основной таблицы через соединение. Вы также сохраняете справедливое пространство, используя массив вместо того, чтобы оплачивать 28 байтов на каждую служебную нагрузку для каждого тега в таблице соединений.
Если ваша скорость вставки и обновления на основной таблице довольно низкая - в том числе изменения в тегах - тогда GIN может быть подходящим выбором. В противном случае я, вероятно, пошёл бы на типичное b-дерево в таблице соединений, со вторичным индексом на (tag, object_id)
, чтобы можно было искать только индексированные объекты для поиска объектов, имеющих данный тег.
В конце концов, самое лучшее, что нужно сделать, это сравнить его для моделирования вашей рабочей нагрузки.
http://www.databasesoup.com/2015/01/tag-all-things.html –