(我在 Heroku Postgres 工作)
我们在一些系统上使用 UUID 作为主键,效果很好。
我建议你使用uuid-ossp
扩展,甚至让 postgres 为你生成 UUID:
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)
编辑性能影响
这将始终取决于您的工作量。
整数主键具有局部性优势,其中相似数据更靠近。这可能有助于例如:范围类型查询,例如WHERE id between 1 and 10000
虽然锁争用更糟。
如果您的读取工作负载是完全随机的,因为您总是进行主键查找,那么不应该有任何可测量的性能下降:您只需为更大的数据类型付费。
你在这张桌子上写了很多,这张桌子很大吗?尽管我没有对此进行测量,但有可能维持该指数会产生影响。不过,对于很多数据集,UUID 就可以了,并且使用 UUID 作为标识符具有一些不错的属性。
最后,我可能不是最有资格对此进行讨论或提出建议的人,因为我从来没有运行过一个足够大的表,它的 UUID PK 已经成为问题。YMMV。(话虽如此,我很想听听有人遇到这种方法的问题!)