sql >> Database teknologi >  >> RDS >> PostgreSQL

Vil UUID som primær nøgle i PostgreSQL give dårlig indeksydelse?

(Jeg arbejder på Heroku Postgres)

Vi bruger UUID'er som primære nøgler på nogle få systemer, og det fungerer godt.

Jeg anbefaler, at du bruger uuid-ossp udvidelse, og endda få postgres til at generere UUID'er til dig:

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)

EDIT ydeevne implikationer

Det vil altid afhænger af din arbejdsbyrde.

Heltals primærnøglen har fordelen af ​​lokalitet, hvor lignende-data sidder tættere sammen. Dette kan være nyttigt for f.eks.:områdetypeforespørgsler såsom WHERE id between 1 and 10000 selvom låsestrid er værre.

Hvis din læsebelastning er fuldstændig tilfældig, idet du altid foretager primære nøgleopslag, bør der ikke være nogen målbar ydeevneforringelse:du betaler kun for den større datatype.

Skriver du meget til denne tabel, og er denne tabel meget stor? Det er muligt, selvom jeg ikke har målt dette, at der er implikationer i at opretholde det indeks. For mange datasæt er UUID'er dog fint, og at bruge UUID'er som identifikatorer har nogle gode egenskaber.

Endelig er jeg måske ikke den mest kvalificerede til at diskutere eller rådgive om dette, da jeg aldrig har kørt et bord stort nok med en UUID PK, hvor det er blevet et problem. YMMV. (Når det er sagt, ville jeg elske at høre om folk, der løber ind i problemer med tilgangen!)



  1. PostgreSQL 'NOT IN' og underforespørgsel

  2. MyBatis RowBounds begrænser ikke forespørgselsresultater

  3. Hvordan bruger man Alias ​​i Where-klausulen?

  4. Opret en Database Mail Profile (SSMS)