(我在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.(话虽如此,我还是希望听到有人在这种方法上遇到问题!)