Jestem nowy w PostgreSQL i trochę nowy w bazach danych w ogóle. Czy istnieje ustalony sposób indeksowania wartości UUID w Postgres? Jestem podzielony między używaniem mieszania i używania trie, chyba że jest już coś wbudowanego, z którego korzysta automatycznie. Cokolwiek użyję, będzie obsługiwać ogromne ilości danych.
Rodzina operatorów SP-GiST „text_ops” indeksuje za pomocą trie. Ponieważ identyfikatory UUID są dość długie i bardzo odmienne, brzmią atrakcyjnie, nawet jeśli przeprowadzałbym tylko pełne wyszukiwania.
Istnieje również opcja skrótu. Hashing to O (1) i nie będę musiał robić żadnych porównań poza równością, oczywiście, ale ponieważ UUID są dość długie, obawiam się, że generowanie z nich skrótów zmarnowałoby dużo czasu.
A może jest to coś, co zbytnio zależy od systemu i specyfiki?
Wolę używać bigserial w większości przypadków, ale powiedziano mi używać UUID do tego. Potrzebujemy UUID, ponieważ możemy mieć wiele serwerów korzystających z różnych baz danych, więc nie ma gwarancji, że będziemy mieć unikalne biginty. Możemy zastosować inną sekwencję (i seed) dla każdego serwera, ale nadal nie jest tak elastyczny jak UUID. Na przykład nie bylibyśmy w stanie migrować wpisów bazy danych z jednego serwera na inny bez konwersji wszędzie identyfikatorów i ich odniesień.
źródło
Odpowiedzi:
Użyj wbudowanego
uuid
typu danych PostgreSQL i utwórz na nim zwykły indeks b-drzewa.Nie trzeba robić nic specjalnego. Spowoduje to optymalny indeks, a także zapisze
uuid
pole w tak zwartej formie, jak jest to obecnie praktyczne.(Indeksy Hash w PostgreSQL przed wersją 10 nie były odporne na awarie i były naprawdę historyczną relikwią, która i tak zwykle działała nie lepiej niż b-drzewo. Unikaj ich. Na PostgreSQL 10 zostały one zabezpieczone przed awarią i miały trochę wprowadzone ulepszenia wydajności, więc możesz je rozważyć).
Jeśli z jakiegoś powodu nie możesz użyć tego
uuid
typu, zwykle tworzysz b-drzewo na reprezentacji tekstowej lub, najlepiej,bytea
reprezentacji UUID.źródło
hash
indeksów w porównaniub-tree
z powszechnym przekonaniem, uważam, że warto byłoby cytować źródła takiego twierdzenia.hash
indeksy są teraz odporne na awarie. To powiedziawszy,hash
indeksy mogą być używane tylko z=
, więc jeśli potrzebujesz innych operatorów,b-tree
nadal jest preferowane.hash
wynika , że kilka lat później nie było dużo szybsze niżb-tree
nawet w Postgresie 10. Ale ponieważ indeksy skrótów zajmują o wiele mniej miejsca na dysku niż b-drzewo, może być szybsze w konfiguracji, w której duże indeksy stają się problem, który moim zdaniem nie dotyczył mnie. Cóż, teraz uważam, że mogę bezpiecznie używać ich w wersji 10.W PostgreSQL brakuje indeksów skrótu. PostgreSQL wie, że potrzebuje indeksów skrótów i że jego kod dla indeksów skrótów jest stary i spleśniały, ale nie usuwają go, ponieważ czekają, aż ktoś przyjdzie i przejdzie indeksowanie skrótów. Zobacz ten wątek:
http://www.postgresql.org/message-id/[email protected]
źródło