Я новичок в PostgreSQL и несколько новичок в базах данных в целом. Существует ли установленный способ индексации значений UUID в Postgres? Я разделен между использованием хеширования и использованием trie, если только у него уже нет чего-то встроенного, что он использует автоматически. Все, что я использую, будет обрабатывать огромные объемы данных.
Семейство операторов SP-GiST "text_ops" индексирует с помощью дерева. Поскольку UUID довольно длинные и очень разные, они звучат привлекательно, даже если бы я только когда-либо делал поиск по полному совпадению.
Также есть опция хеширования. Хеширование - это O (1), и мне не нужно делать никаких сравнений, кроме равенства, конечно, но поскольку UUID довольно длинные, я боюсь, что генерация хешей из них потратит много времени.
Или это слишком сильно зависит от системы и особенностей использования?
Я бы предпочел использовать bigserial в большинстве случаев, но мне сказали использовать для этого uuid . Нам нужен uuid, потому что у нас может быть несколько серверов, использующих разные базы данных, поэтому нет гарантии, что у нас будут уникальные особенности. Мы могли бы использовать различную последовательность (и начальное число) для каждого сервера, но она все еще не так гибка, как UUID. Например, мы не сможем перенести записи базы данных с одного сервера на другой без конвертации идентификаторов и их ссылок повсюду.
источник
Ответы:
Используйте встроенный
uuid
тип данных PostgreSQL и создайте для него обычный индекс b-дерева.Нет необходимости делать что-то особенное. Это приведет к оптимальному индексу, а также сохранит
uuid
поле в такой компактной форме, как это в настоящее время практично.(Хеш-индексы в PostgreSQL до версии 10 не были безопасными при сбое и были действительно историческим пережитком, который в любом случае имел тенденцию работать не лучше, чем b-дерево. Избегайте их. В PostgreSQL 10 они были сделаны безопасными для сбоя и имели некоторые сделаны улучшения производительности, поэтому вы можете рассмотреть их.)
Если по какой-либо причине вы не можете использовать
uuid
тип, вы обычно создаете b-дерево в текстовом представлении или, предпочтительно, вbytea
представлении uuid.источник
hash
индексов и сравненияb-tree
является общепринятым мнением, я думаю, что было бы полезно привести источники для такого утверждения.hash
индексы теперь защищены от сбоев. Тем не менее,hash
индексы могут использоваться только с=
, поэтому, если вам нужны какие-либо другие операторы,b-tree
все еще предпочтительнее.hash
не было намного быстрее, чемb-tree
даже в Postgres 10. Но поскольку хэш-индексы занимают намного меньше дискового пространства, чем b-tree, это может быть быстрее в установке, где большие индексы становятся проблема, которая, я чувствую, была не для меня. Хорошо, теперь я буду следить за тем, чтобы я мог безопасно использовать их в v10.Хеш-индексы отсутствуют в действии в PostgreSQL. PostgreSQL знает, что ему нужны хеш-индексы, и что код для хеш-индексов устарел и запутан, но они не удаляют его, потому что ждут, когда кто-нибудь придет и пересмотрит хеш-индексацию. Смотрите эту тему:
http://www.postgresql.org/message-id/4407.1115698257@sss.pgh.pa.us
источник