PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wird UUID als Primärschlüssel in PostgreSQL zu einer schlechten Indexleistung führen?

(Ich arbeite an Heroku Postgres)

Wir verwenden UUIDs als Primärschlüssel auf einigen wenigen Systemen und es funktioniert hervorragend.

Ich empfehle Ihnen, den uuid-ossp zu verwenden Erweiterung, und lassen Sie Postgres sogar UUIDs für Sie generieren:

heroku pg:psql
psql (9.1.4, server 9.1.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

dcvgo3fvfmbl44=> CREATE EXTENSION "uuid-ossp"; 
CREATE EXTENSION  
dcvgo3fvfmbl44=> CREATE TABLE test (id uuid primary key default uuid_generate_v4(), name text);  
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_pkey" for table "test"
CREATE TABLE  
dcvgo3fvfmbl44=> \d test
                 Table "public.test"  
Column | Type |              Modifiers              
--------+------+-------------------------------------  
id     | uuid | not null default uuid_generate_v4()  name   | text |  
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)

dcvgo3fvfmbl44=> insert into test (name) values ('hgmnz'); 
INSERT 0 1 
dcvgo3fvfmbl44=> select * from test;
                  id                  | name  
--------------------------------------+-------   
 e535d271-91be-4291-832f-f7883a2d374f | hgmnz  
(1 row)

Leistungsauswirkungen BEARBEITEN

Es wird immer hängen von Ihrer Arbeitsbelastung ab.

Der ganzzahlige Primärschlüssel hat den Vorteil der Lokalität, wo ähnliche Daten näher beieinander liegen. Dies kann beispielsweise hilfreich sein für:Bereichstypabfragen wie WHERE id between 1 and 10000 obwohl Sperrkonflikte schlimmer sind.

Wenn Ihre Lesearbeit völlig zufällig ist, da Sie immer Primärschlüsselsuchen durchführen, sollte es keinen messbaren Leistungsabfall geben:Sie zahlen nur für den größeren Datentyp.

Schreiben Sie viel auf diese Tabelle, und ist diese Tabelle sehr groß? Es ist möglich, obwohl ich dies nicht gemessen habe, dass es Auswirkungen auf die Aufrechterhaltung dieses Index gibt. Für viele Datensätze sind UUIDs jedoch in Ordnung, und die Verwendung von UUIDs als Identifikatoren hat einige nette Eigenschaften.

Schließlich bin ich möglicherweise nicht die qualifizierteste Person, um dies zu diskutieren oder zu beraten, da ich noch nie eine ausreichend große Tabelle mit einer UUID-PK geführt habe, bei der dies zu einem Problem geworden ist. YMMV. (Trotzdem würde ich gerne von Leuten hören, die Probleme mit dem Ansatz haben!)