Cần chỉ mục trên khóa ngoại


30

Tôi đang vật lộn với các chỉ mục, khóa chính và khóa ngoại ... Và nhu cầu có tất cả.

Nếu tôi có hai bảng, cả hai bảng đều có số nguyên là khóa chính.
Bảng đầu tiên tham chiếu thông qua FK đến khóa chính của bảng thứ hai.

  • Trên cả hai bảng tôi có một chỉ mục khóa chính trên cột ID
  • Tôi đã tạo một ràng buộc FK đối với table1.ref_fieldtham chiếu PK của bảng thứ hai ( table2.id)
  • và tôi đã thêm một chỉ mục trên table1.ref_field

Đây có phải là cách tốt nhất để tổ chức các chỉ mục, khóa chính và khóa ngoài?

Câu trả lời:


30

Thiết kế của bạn là tốt. Nếu bạn đang gặp vấn đề về hiệu năng (mà bạn không thể biết tại thời điểm thiết kế), bạn nên tạo một chỉ mục trên cột table1.ref_field, theo cùng thứ tự (ASC) với cột table2.id. Điều này sẽ cải thiện hiệu suất khi nối giữa các bảng với cột / cột. Có chi phí để duy trì bất kỳ chỉ số nào, vì vậy bạn muốn cân nhắc chi phí đó với lợi ích của hiệu suất được cải thiện.

Thật không may, PostgreSQL không tự động tạo các chỉ mục như vậy trên các cột khóa ngoài tham chiếu các cột khác, vì vậy bạn phải tự làm điều đó.

Đây là một câu hỏi StackOverflow về cùng một chủ đề:

Postgres và Index trên Khóa ngoài và Khóa chính

Đây là một truy vấn để giúp xác định nơi bạn có thể hưởng lợi từ việc thêm một chỉ mục như vậy:

Postgresql: Chỉ mục trên Khóa ngoài


Điều này không phải lúc nào cũng đáng tiếc - nếu bạn không DELETEtừ bảng được tham chiếu thì nó có thể giúp bạn tiết kiệm rất nhiều I / O và CPU tránh việc duy trì một chỉ mục không sử dụng. Tôi nghĩ rằng nó nên được tạo theo mặc định, chỉ cần có một tùy chọn để ngăn chặn việc tạo ra nó.
Craig Ringer

Craig Ringer Không chỉ XÓA có thể có tác động đến điều đó, nếu bạn đã chọn từ một phần đến các bảng con, bạn cũng sẽ gặp vấn đề về hiệu suất. Tài liệu này từ Oracle giải thích thêm: asktom.oracle.com/pls/asktom/ Kẻ
777Anon
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.