2013-06-03 32 views
8

Giả sử tôi có một bảng có cột lấy giá trị từ 1 đến 10. Tôi cần phải chọn các cột có tất cả các giá trị ngoại trừ 9 và 10. Sẽ có sự khác biệt (hiệu suất khôn ngoan) khi Tôi sử dụng truy vấn này:SQL - IN so với NOT IN

SELECT * FROM tbl WHERE col NOT IN (9, 10) 

và cái này?

SELECT * FROM tbl WHERE col IN (1, 2, 3, 4, 5, 6, 7, 8) 
+2

'GIỮA 1 VÀ 8' có thể thích hợp hơn mặc dù không đáng để dành thời gian ngay cả khi xem xét vấn đề cho một bảng nhỏ như vậy. Tình hình thực tế của bạn có khác nhau không? –

+0

xin lỗi bạn đúng. xóa. –

+0

@Martin Smith - Tôi đã xem xét nó như là một tình huống lý thuyết, tôi sẽ không sử dụng các truy vấn đó :) – kyooryu

Trả lời

8

Khi nói đến hiệu suất mà bạn nên luôn luôn mã số hồ sơ của bạn (ví dụ: chạy các truy vấn của bạn vài ngàn lần và đo mỗi vòng hiệu suất sử dụng một số loại stopwatch. Sample).

Nhưng ở đây tôi khuyên bạn nên sử dụng truy vấn đầu tiên để duy trì tương lai tốt hơn. Logic là bạn cần tất cả các bản ghi nhưng 9 và 10. Nếu bạn thêm giá trị 11 vào bảng của bạn và sử dụng truy vấn thứ hai, logic của ứng dụng của bạn sẽ bị hỏng sẽ dẫn đến lỗi, tất nhiên.

Chỉnh sửa: Tôi nhớ điều này đã được gắn thẻ là php đó là lý do tôi cung cấp mẫu bằng php, nhưng có thể tôi đã nhầm. Tôi đoán sẽ không khó để viết lại mẫu đó bằng ngôn ngữ bạn đang sử dụng.

0

Đối với một danh sách các hằng số, MySQL sẽ nội bộ mở rộng mã của bạn để:

SELECT * FROM tbl WHERE ((col <> 9 and col <> 10)) 

Tương tự cho một trong những khác, với 8 lần = để thay thế.

Vì vậy, có, người đầu tiên sẽ nhanh hơn, ít so sánh hơn để được thực hiện. Cơ hội mà nó có thể đo lường là không đáng kể mặc dù, chi phí của một số ít các so sánh liên tục là không có gì so với chi phí chung của phân tích SQL và lấy dữ liệu.

+1

OP không nói cho chúng ta biết RDBMS nào đang ở trên nhưng AFAIK trong MySQL là' IN' với một danh sách các hằng số được thực hiện bằng cách sử dụng tìm kiếm nhị phân của danh sách thay vì so sánh 8 '='. –

+0

Ngay cả khi nó đã làm (tôi không bao giờ tin vào MySQL để làm bất kỳ loại 'tiên tiến' tối ưu, giả định an toàn nhất) nó làm cho một thứ hai về mặt lý thuyết hơi chậm hơn vì vẫn còn nhiều so sánh được thực hiện. –

2

Tôi đã thấy Oracle gặp sự cố khi tối ưu hóa một số truy vấn với NOT IN nếu các cột không có giá trị. Nếu bạn có thể viết truy vấn theo cách nào đó, thì IN được ưu tiên như tôi quan tâm.

9

Sử dụng "IN" vì nhiều khả năng DBMS sẽ sử dụng chỉ mục trên cột tương ứng.

"KHÔNG IN" có thể về lý thuyết cũng được dịch sang sử dụng chỉ mục, nhưng theo cách phức tạp hơn mà DBMS có thể không "chi tiêu thời gian sử dụng".