PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Liệu UUID làm khóa chính trong PostgreSQL có cho hiệu suất chỉ mục kém không?

(Tôi làm việc trên Heroku Postgres)

Chúng tôi sử dụng UUID làm khóa chính trên một số hệ thống và nó hoạt động rất tốt.

Tôi khuyên bạn nên sử dụng uuid-ossp và thậm chí có các postgres tạo UUID cho bạn:

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)

CHỈNH SỬA hàm ý về hiệu suất

Nó sẽ luôn luôn phụ thuộc vào khối lượng công việc của bạn.

Khóa chính số nguyên có lợi thế về địa phương nơi dữ liệu giống nhau nằm gần nhau hơn. Điều này có thể hữu ích cho ví dụ:truy vấn loại phạm vi chẳng hạn như WHERE id between 1 and 10000 mặc dù tranh chấp về khóa còn tồi tệ hơn.

Nếu khối lượng công việc đọc của bạn là hoàn toàn ngẫu nhiên trong đó bạn luôn thực hiện tra cứu khóa chính, sẽ không có bất kỳ sự suy giảm hiệu suất có thể đo lường nào:bạn chỉ trả tiền cho loại dữ liệu lớn hơn.

Bạn viết rất nhiều vào bảng này, và bảng này có rất lớn không? Có thể, mặc dù tôi chưa đo lường điều này, nhưng có những tác động trong việc duy trì chỉ số đó. Đối với nhiều tập dữ liệu, UUID vẫn ổn và việc sử dụng UUID làm mã định danh có một số thuộc tính tốt.

Cuối cùng, tôi có thể không phải là người đủ trình độ nhất để thảo luận hoặc tư vấn về vấn đề này, vì tôi chưa bao giờ chạy một bảng đủ lớn với UUID PK mà nó đã trở thành vấn đề. YMMV. (Đã nói rằng, tôi rất muốn nghe về những người gặp vấn đề với cách tiếp cận!)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nâng cấp Slony-I 2.0.x lên phiên bản 2.1.x mới nhất

  2. Thêm ngày vào một ngày trong PostgreSQL

  3. Giao điểm của nhiều mảng trong PostgreSQL

  4. Sử dụng nhiều mục tiêu xung đột trong mệnh đề ON CONFLICT

  5. Giải thích về JSONB do PostgreSQL giới thiệu