2008-11-03 33 views
6

Tôi muốn tìm kiếm một bảng để tìm tất cả các hàng trong đó một trường cụ thể là một trong hai giá trị. Tôi biết chính xác giá trị sẽ là gì, nhưng tôi tự hỏi đó là cách hiệu quả nhất để tìm kiếm chúng:Sử dụng IN hoặc tìm kiếm văn bản

vì lợi ích của ví dụ, hai giá trị là "xpoints" và "ypoints". Tôi biết chắc chắn rằng sẽ không có giá trị khác trong lĩnh vực mà trong đó có "điểm" ở cuối, vì vậy hai truy vấn tôi đang xem xét là:

WHERE `myField` IN ('xpoints', 'ypoints') 
--- or... 
WHERE `myField` LIKE '_points' 

mà sẽ cung cấp kết quả tốt nhất trong trường hợp này?

Trả lời

14

Như thường lệ với các truy vấn SQL, hãy chạy nó thông qua trình lược tả để tìm hiểu. Tuy nhiên, bản năng ruột của tôi sẽ phải nói rằng tìm kiếm IN sẽ nhanh hơn. Đặc biệt trong ví dụ bạn đưa ra, nếu trường được lập chỉ mục, nó sẽ chỉ phải thực hiện 2 lần tra cứu. Nếu bạn đã thực hiện tìm kiếm tương tự, nó có thể phải quét, bởi vì bạn đang tìm kiếm các bản ghi kết thúc bằng một giá trị nhất định. Nó cũng sẽ chính xác hơn khi LIKE '_points' cũng có thể trả về 'gpoints', hoặc bất kỳ chuỗi tương tự nào khác.

+0

tất nhiên, nó sẽ phụ thuộc vào kích thước thực tế của bảng ... Nếu nó nhỏ thì trình tối ưu hóa đơn giản sẽ chọn quét bảng. –

1

Trừ khi tất cả các mục dữ liệu trong cột được đề cập bắt đầu bằng 'x' hoặc 'y', tôi tin rằng IN sẽ luôn cung cấp cho bạn truy vấn tốt hơn. Nếu nó được lập chỉ mục, như @Kibbee chỉ ra, bạn sẽ chỉ phải thực hiện 2 lần tra cứu để có được cả hai. Ngoài ra, nếu nó không được lập chỉ mục, quét bảng bằng IN sẽ chỉ phải kiểm tra chữ cái đầu tiên trong khi với LIKE nó sẽ phải kiểm tra hai ký tự mỗi lần (giả sử tất cả các mục có ít nhất 2 ký tự) - kể từ nhân vật đầu tiên được phép làm bất cứ điều gì.

0

Hãy thử và xem. Tạo một lượng lớn dữ liệu thử nghiệm, Ngoài ra, hãy thử với và không có chỉ mục trên myfield. Khi bạn đang ở đó, hãy xem liệu có sự khác biệt đáng chú ý giữa LIKE 'điểm' và LIKE 'xpoint' hay không.

Tùy thuộc vào những gì trình tối ưu hóa thực hiện với mỗi truy vấn.

Đối với một lượng nhỏ dữ liệu, sự khác biệt sẽ không đáng kể. Làm cái nào có ý nghĩa hơn. Đối với số lượng lớn dữ liệu, lượng I/O đĩa quan trọng hơn nhiều so với lượng thời gian của CPU.

Tôi cá rằng IN sẽ mang lại cho bạn kết quả tốt hơn LIKE, nếu có chỉ mục trên myfield. Tôi cũng cá cược rằng 'xpoint_' chạy nhanh hơn '_points'. Nhưng không có gì giống như thử nó cho mình.

0

MySQL không thể sử dụng chỉ mục khi sử dụng so sánh chuỗi như LIKE '% foo' hoặc '_foo', nhưng có thể sử dụng chỉ mục để so sánh như 'foo%' và 'foo_'.

Vì vậy, trong trường hợp của bạn, IN sẽ nhanh hơn nhiều giả định rằng trường được lập chỉ mục.

Nếu bạn đang làm việc với một bộ giới hạn các giá trị có thể, việc xác định trường là ENUM - MySQL sẽ lưu trữ nội bộ dưới dạng số nguyên và thực hiện tra cứu nhanh hơn và tiết kiệm dung lượng đĩa.

0

Sẽ nhanh hơn để thực hiện phiên bản IN so với phiên bản LIKE. Đặc biệt khi ký tự đại diện của bạn không ở cuối quá trình so sánh, nhưng ngay cả trong điều kiện lý tưởng IN vẫn sẽ lý tưởng cho đến khi truy vấn của bạn gần với kích thước chèn tối đa truy vấn của bạn.

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