2013-06-04 43 views
14

Giả sử, tôi có một bảng ResidentInfo và trong bảng này, tôi có các ràng buộc duy nhất HomeAddress, là loại VARCHAR. Đối với truy vấn trong tương lai, tôi sẽ thêm một chỉ mục trên cột này. Truy vấn sẽ chỉ có hoạt động = và tôi sẽ sử dụng mẫu B-TREE vì mẫu Hash không được đề xuất hiện tại.chỉ mục postgresql trên cột chuỗi

Câu hỏi: Từ chế độ xem hiệu quả, sử dụng B-TREE, bạn có nghĩ rằng tôi nên thêm cột mới với số 1,2,3 ...., N tương ứng với số nội địa khác và thay vì thêm chỉ mục trên HomeAddress, Tôi nên thêm chỉ mục vào cột số?

Tôi đặt câu hỏi này bởi vì tôi không biết chỉ mục hoạt động như thế nào.

+0

Cảm ơn @Denis đã chỉ ra rằng ràng buộc duy nhất sẽ thiết lập chỉ mục tự động. – Hao

+0

Theo hiệu suất, có một hướng dẫn luôn áp dụng: kiểm tra nó. Không thể nhận được tất cả các giai đoạn của bạn từ mô tả mơ hồ như vậy, khi bạn hỏi về tốc độ, hãy kiểm tra những gì nhanh nhất cho bạn. Có những trường hợp phương pháp tiếp cận tối ưu về mặt lý thuyết nhanh hơn cho dữ liệu bạn thường xử lý. – omikron

Trả lời

23

Để kiểm tra bình đẳng đơn giản (=), chỉ mục B-Tree trên cột varchar hoặc text thật đơn giản và là lựa chọn tốt nhất. Nó chắc chắn giúp hiệu suất rất nhiều.

Tất nhiên, chỉ mục B-Tree trên đơn giản integer hoạt động tốt hơn. Để bắt đầu, so sánh các giá trị đơn giản integer nhanh hơn một chút. Nhưng quan trọng hơn, hiệu suất cũng là một chức năng của kích thước của chỉ mục. Cột lớn hơn có nghĩa là có ít hàng hơn trên mỗi trang dữ liệu, nghĩa là bạn phải đọc nhiều trang hơn ...

Vì số HomeAddress hầu như không phải là duy nhất, nó không phải là khóa chính tự nhiên tốt. Tôi thực sự khuyên bạn nên sử dụng một khóa chính thay thế chính thay thế. Một serial column là sự lựa chọn hiển nhiên cho điều đó. Mục đích duy nhất của nó là có một khóa chính nhanh, đơn giản để làm việc.

Nếu bạn có các bảng khác tham chiếu bảng đã nói, điều này trở nên hiệu quả hơn. Thay vì sao chép chuỗi dài cho cột khóa ngoài, bạn chỉ cần 4 byte cho cột số nguyên. Và bạn không cần phải cập nhật quá nhiều, vì địa chỉ bị ràng buộc thay đổi, trong khi đó, một pk thay thế có thể giữ nguyên (nhưng dĩ nhiên không phải tất nhiên).

bảng bạn có thể trông như thế này:

CREATE TABLE resident (
    resident_id serial PRIMARY KEY 
    ,address text NOT NULL 
    -- more columns 
); 

CREATE INDEX resident_adr_idx ON resident(address); 

Điều này dẫn đến hai chỉ số B-Tree. Chỉ mục duy nhất trên resident_id và chỉ mục đơn giản trên address.

More about indexes in the manual.
Postgres cung cấp nhiều tùy chọn - nhưng bạn không cần thêm bất kỳ tùy chọn nào cho trường hợp đơn giản này.

+0

Cảm ơn bạn rất nhiều! Điều này thực sự hữu ích! Vì vậy, hai chỉ số B-Tree sẽ tăng tốc các truy vấn như "SELECT * FROM resident WHERE resident_id = xxxxx;" và cũng cung cấp cho tôi một tùy chọn trong trường hợp tôi phải truy vấn bằng địa chỉ, tôi có đúng không? – Hao

+0

@Hao: Đúng. Ngoài ra, cả hai chỉ mục đều hỗ trợ nhiều hơn kiểm tra bình đẳng đơn giản. –

+0

Cảm ơn bạn! Như bạn đã đề cập, liên quan đến các hoạt động của B-TREE, chỉ số Hash Pattern của EnterpriseDB vẫn còn thiếu sót ngay bây giờ và tôi có thể chuyển sang Hash Pattern sau khi sửa lỗi, vì tôi chỉ sử dụng "=" hoạt động cho truy vấn. Đưa O (1) cho Hash và O (nlogn) cho B-Tree. – Hao

5

Trong Postgres, ràng buộc duy nhất được thực thi bằng cách duy trì một chỉ mục duy nhất trên trường, do đó bạn đã được bảo vệ.

Trong trường hợp bạn quyết định chế duy nhất trên địa chỉ là xấu (trong đó, một cách trung thực, đó là: những gì một người bạn đời tạo một tài khoản riêng về flatshares vv?), Bạn có thể tạo một mặt hàng như vậy:

create index on ResidentInfo (HomeAddress); 
+0

Ồ, cảm ơn vì đã chỉ ra điều đó!Nhưng câu hỏi vẫn còn đó. Truy vấn sẽ nhanh hơn nếu tôi thêm cột số và sử dụng nó thay vì địa chỉ? – Hao

Các vấn đề liên quan