Làm thế nào tôi nên lập chỉ mục một UUID trong Postgres?


26

Tôi mới sử dụng PostgreSQL và hơi mới đối với cơ sở dữ liệu nói chung. Có cách nào được thiết lập về cách chúng ta nên lập chỉ mục các giá trị UUID trong Postgres không? Tôi phân chia giữa việc sử dụng băm và sử dụng bộ ba, trừ khi có một cái gì đó tích hợp sẵn mà nó sử dụng tự động. Bất cứ điều gì tôi sử dụng sẽ được xử lý một lượng lớn dữ liệu.

Các chỉ mục "text_ops" của toán tử SP-GiST sử dụng bộ ba. Bởi vì UUID khá dài và rất khác nhau, những âm thanh này hấp dẫn mặc dù tôi chỉ thực hiện tìm kiếm kết hợp đầy đủ.

Ngoài ra còn có một tùy chọn băm. Băm là O (1) và tôi sẽ không cần phải so sánh ngoài việc bình đẳng, nhưng vì UUID khá dài, tôi sợ rằng việc tạo băm từ chúng sẽ lãng phí rất nhiều thời gian.

Hay đây là một cái gì đó phụ thuộc quá nhiều vào hệ thống và sử dụng chi tiết cụ thể?

Tôi thà sử dụng bigserial trong hầu hết các trường hợp, nhưng tôi đã được khuyên sử dụng uuid cho việc này. Chúng tôi cần uuid vì chúng tôi có thể có nhiều máy chủ sử dụng các cơ sở dữ liệu khác nhau, vì vậy không có gì đảm bảo rằng chúng tôi sẽ có những gợi ý độc đáo. Chúng tôi có thể sử dụng một chuỗi (và hạt giống) khác nhau cho mỗi máy chủ, nhưng nó vẫn không linh hoạt như UUID. Ví dụ: chúng tôi sẽ không thể di chuyển các mục cơ sở dữ liệu từ máy chủ này sang máy chủ khác mà không cần chuyển đổi ID và tài liệu tham khảo của chúng ở mọi nơi.


2
Tôi tin rằng "cơ sở dữ liệu liên kết" là từ thông dụng cho tình huống của bạn. Và, vâng, UUID là giải pháp cho điều đó. Đó là lý do UUID được phát minh từ nhiều thập kỷ trước: để chia sẻ dữ liệu giữa các hệ thống phân tán mà không có sự phối hợp tập trung.
Basil Bourque

Nhiều tháng sau: Thật vậy, "cơ sở dữ liệu liên kết" Basil Bourque đưa ra là những gì chúng ta sẽ làm. Chúng tôi không chỉ có nhiều máy chủ, mà chúng tôi còn có các máy khách (có thể được coi là nhiều phần của DB được liên kết) tạo ID khi ngoại tuyến. Đó là lý do tại sao chúng tôi sử dụng UUID.
sudo

Câu trả lời:


31

Sử dụng uuidkiểu dữ liệu tích hợp của PostgreSQL và tạo một chỉ mục b-cây thông thường trên đó.

Không cần phải làm gì đặc biệt. Điều này sẽ dẫn đến một chỉ mục tối ưu và cũng sẽ lưu trữ uuidtrường dưới dạng nhỏ gọn như hiện tại.

(Các chỉ mục Hash trong PostgreSQL trước phiên bản 10 không an toàn với sự cố và thực sự là một di tích lịch sử có xu hướng hoạt động không tốt hơn một cây b. Dù sao, hãy tránh chúng. Trên PostgreQuery 10 chúng đã được tạo ra an toàn và có một số cải thiện hiệu suất được thực hiện để bạn có thể muốn xem xét chúng.)

Nếu vì lý do nào đó bạn không thể sử dụng uuidloại này, bạn thường sẽ tạo một cây b trên biểu diễn văn bản hoặc tốt nhất là byteađại diện cho uuid.


2
Mặc dù tuyên bố liên quan đến hashcác chỉ số so với b-treelà một niềm tin thường thấy, tôi nghĩ sẽ hữu ích khi trích dẫn các nguồn cho yêu cầu như vậy.
Volte

1
Kể từ PostgreSQL 10, hashcác chỉ mục hiện đang an toàn. Điều đó nói rằng, hashcác chỉ mục chỉ có thể được sử dụng với =, vì vậy nếu bạn cần bất kỳ toán tử nào khác, b-treevẫn thích hợp hơn.
rintaun

1
Một vài năm sau, theo kinh nghiệm của tôi, hashđã không nhanh hơn nhiều b-tree, ngay cả trong Postgres 10. Nhưng vì các chỉ mục băm chiếm ít không gian đĩa hơn b-cây, nên có thể nhanh hơn trong một thiết lập khi các chỉ mục lớn trở thành vấn đề, mà tôi cảm thấy không phải là trường hợp của tôi. Bây giờ tôi sẽ để mắt đến việc tôi thực sự có thể sử dụng chúng một cách an toàn trong v10.
sudo

Có một số cách viết tốt về cải thiện chỉ số băm trong v10 và v11: rhaas.blogspot.com/2017/09/ . - - amitkapila16.blogspot.com/2017/03/
Glenn Morton

3

Các chỉ mục băm bị thiếu trong hành động trong PostgreSQL. PostgreSQL biết rằng nó cần các chỉ mục băm và mã của nó cho các chỉ mục băm đã cũ và bị mốc, nhưng họ không xóa nó vì họ đang chờ ai đó xuất hiện và đại tu chỉ mục băm. Xem chủ đề này:

http://www.postgresql.org/message-id/4407.1115698257@sss.pgh.pa.us


Vâng, tôi nhận được một cảnh báo khi tôi cố gắng sử dụng một chỉ số băm. "Rất nản lòng" hoặc một cái gì đó.
sudo

Các chỉ mục băm hoạt động tốt trong PostgreSQL trong một số trường hợp, nhưng gần đây tôi thấy chúng khiến các truy vấn của tôi không trả lại kết quả khi tôi thử tối ưu hóa với các chỉ mục băm trên các khóa chính & khóa ngoài loại dữ liệu UUID tích hợp. Thực sự có lợi ích cho các chỉ mục băm, nếu chỉ chúng hoạt động cho tất cả các loại dữ liệu và các nhà phát triển PostgreQuery biết điều này, thì họ quá lười để tự sửa nó và họ giữ mã của họ như thể họ đang cầu nguyện / cho sự kiện cuối cùng của họ vị cứu tinh.
derekm

2
Ai đó đã giải cứu các chỉ mục băm, tôi đoán vì họ đóng vai trò quan trọng trong việc phân vùng dữ liệu, mà PG10 đã tập trung vào: wiki.postgresql.org/wiki/. Nhưng họ vẫn không cung cấp cho bạn mọi thứ về mặt lý thuyết mà tôi đã thấy hữu ích trong lớp cơ sở dữ liệu đại học;)
sudo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.