Ich bin neu in PostgreSQL und etwas neu in Datenbanken im Allgemeinen. Gibt es eine etablierte Methode, wie wir UUID- Werte in Postgres indizieren sollen ? Ich bin gespalten zwischen der Verwendung von Hashing und der Verwendung eines Trie, es sei denn, es ist bereits etwas eingebaut, das es automatisch verwendet. Was auch immer ich benutze, es wird riesige Datenmengen verarbeiten.
Die SP-GiST-Operatorfamilie "text_ops" indiziert mithilfe eines Tries. Da UUIDs ziemlich lang und sehr unterschiedlich sind, klingen sie ansprechend, obwohl ich immer nur vollständige Übereinstimmungssuchen durchführen würde.
Es gibt auch eine Hash-Option. Hashing ist O (1), und ich muss natürlich neben Gleichheit keine Vergleiche anstellen, aber da UUIDs ziemlich lang sind, befürchte ich, dass das Generieren von Hashes viel Zeit verschwenden würde.
Oder ist dies etwas, das zu sehr vom System und den Verwendungsspezifikationen abhängt?
Ich würde eher verwenden bigserial in den meisten Fällen, aber ich habe gehört, verwenden UUID für diese. Wir brauchen uuid, weil wir möglicherweise mehrere Server haben, die unterschiedliche Datenbanken verwenden. Es gibt also keine Garantie dafür, dass wir eindeutige Bigints haben. Wir könnten für jeden Server eine andere Sequenz (und einen anderen Startwert) verwenden, aber es ist immer noch nicht so flexibel wie UUIDs. Zum Beispiel wären wir nicht in der Lage, Datenbankeinträge von einem Server auf einen anderen zu migrieren, ohne die IDs und ihre Referenzen überall zu konvertieren.
quelle
Antworten:
Verwenden Sie den in PostgreSQL integrierten
uuid
Datentyp und erstellen Sie einen regulären B-Tree-Index.Es besteht keine Notwendigkeit, etwas Besonderes zu tun. Dies führt zu einem optimalen Index und speichert das
uuid
Feld in einer so kompakten Form, wie es derzeit praktikabel ist.(Hash-Indizes in PostgreSQL vor Version 10 waren nicht absturzsicher und stellten in Wirklichkeit ein historisches Relikt dar, das ohnehin nicht besser lief als ein B-Tree. Vermeiden Sie sie. Unter PostgreSQL 10 wurden sie absturzsicher gemacht und hatten einige Leistungsverbesserungen, die Sie möglicherweise in Betracht ziehen möchten.)
Wenn Sie den
uuid
Typ aus irgendeinem Grund nicht verwenden könnten , würden Sie im Allgemeinen einen B-Baum in der Textdarstellung oder vorzugsweise in einerbytea
Darstellung der UUID erstellen .quelle
hash
Indizes im Vergleich zu Indizesb-tree
allgemein anerkannt ist, halte ich es für hilfreich, Quellen für eine solche Behauptung zu zitieren.hash
Indizes jetzt absturzsicher. Das heißt,hash
Indizes können nur mit verwendet=
werden. Wenn Sie also andere Operatoren benötigen,b-tree
ist dies immer noch vorzuziehen.hash
nach nicht viel schneller alsb-tree
in Postgres 10. Da Hash-Indizes jedoch so viel weniger Speicherplatz beanspruchen als B-Tree, ist es in einem Setup, in dem große Indizes zu A werden, möglicherweise schneller Problem, das meiner Meinung nach bei mir nicht der Fall war. Nun, ich werde jetzt aufpassen, dass ich sie in v10 tatsächlich sicher verwenden kann.In PostgreSQL fehlen Hash-Indizes. PostgreSQL weiß, dass es Hash-Indizes benötigt und dass der Code für Hash-Indizes alt und muffig ist, aber sie entfernen ihn nicht, weil sie darauf warten, dass jemand vorbeikommt und die Hash-Indizierung überarbeitet. Siehe diesen Thread:
http://www.postgresql.org/message-id/[email protected]
quelle