Đây có phải là một ý tưởng / cách tiếp cận tốt để lập chỉ mục cột VARCHAR không?


32

Chúng tôi đang sử dụng PostgreSQL v8.2.3.

Có các bảng liên quan: NHÂN VIÊNEMAILLIST .

Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)

2 bảng được nối theo cách mà nếu EMPLOYEE.EMAIL1 hoặc EMPLOYEE.EMAIL2 không có mục phù hợp, các hàng đó sẽ được trả về.

SELECT employee.email1, employee.email2,
        e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
   FROM employee
   LEFT JOIN emaillist e1 ON e1.email = employee.email1
   LEFT JOIN emaillist e2 ON e2.email = employee.email2
 WHERE e1.email IS NULL OR e2.email IS NULL

Cột EMAILvarchar (256) của EMAILLISTbảng được lập chỉ mục. Bây giờ, thời gian phản hồi là 14 giây.

Thống kê số lượng bảng: Hiện tại, NHÂN VIÊN đã có 165.018 hồ sơ và EMAILLIST đã có 1.810.228 hồ sơ và cả hai bảng dự kiến ​​sẽ tăng trong tương lai.

  1. Đây có phải là một ý tưởng / cách tiếp cận tốt để lập chỉ mục cột VARCHAR không? Câu hỏi này ngay lập tức xuất hiện trong đầu tôi vì lý do chúng tôi chưa lập chỉ mục cột VARCHAR trước đây trong ứng dụng của chúng tôi. Các chuyên gia tư vấn / đề nghị về điều này được đánh giá cao.
  2. Với truy vấn và chỉ mục hiện tại này, thời gian phản hồi 14 giây là hợp lý hoặc có phạm vi nào để điều chỉnh thêm không? Kinh nghiệm / ý kiến ​​thời gian thực của người dùng khác dựa trên loại kích thước bảng và thời gian phản hồi này là gì?

LƯU Ý: Yêu cầu thực tế / trường hợp sử dụng của tôi được giải thích chi tiết ở đây .

Câu trả lời:


25

Không có gì sai khi lập chỉ mục một cột varchar nếu bạn sẽ thực hiện các truy vấn dựa trên nó. Tuy nhiên, xin lưu ý rằng có giới hạn đối với một số chỉ mục và số lượng chúng có thể lập chỉ mục trong một trường. Ví dụ bạn không thể lập chỉ mục một cột có thể chứa số lượng văn bản không giới hạn. Tuy nhiên, bạn sẽ có thể thực hiện một chỉ mục trên varchar (256) mà không có vấn đề. Hãy thử nó và phân tích các cải tiến trong hiệu suất truy vấn của bạn để xem liệu nó có giúp ích không.


Cảm ơn bình luận có giá trị của bạn. Có phạm vi nào để điều chỉnh thêm truy vấn của tôi về vấn đề này để giảm thời gian phản hồi từ 14 giây không?
G Namam

2
Không có kết quả từ GIẢI THÍCH, không thể biết nên tối ưu hóa cái gì. Phiên bản 8.2.3 cũng đã lỗi thời, bạn nên nâng cấp lên phiên bản mới hơn, chậm hơn 4 năm so với bảo trì. Phiên bản 8.3, 8.4 và 9.0 cũng nhanh hơn trong nhiều tình huống. Thống kê tốt hơn cũng giúp đạt được hiệu suất.
Frank Heikens

5

Không có vấn đề lập chỉ mục một cột varchar như vậy

Trường hợp có thể trở thành vấn đề là khi bạn có cột varchar dưới dạng FK trong bảng tỷ tỷ. Sau đó, bạn sẽ có một khóa thay thế cho PK và FK, nhưng bạn vẫn cần một ràng buộc / chỉ mục duy nhất trên khóa varchar tự nhiên.

Các bảng của bạn khá nhỏ và hiệu suất có thể liên quan đến mệnh đề OR. Thật không may, vấn đề tương tự được áp dụng cho dù bạn cấu trúc truy vấn như thế nào (và tôi không đủ quen thuộc với PostgresQuery để đưa ra nhiều lời xin lỗi)


0

Hãy thử loại bỏ phần "HOẶC e2.email IS NULL" trong truy vấn của bạn và xem nó chạy nhanh như thế nào. Nếu nó chạy nhanh hơn, bạn có thể chạy nó nhanh hơn với "union all"

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.