Việc thêm 'LIMIT 1' vào các truy vấn MySQL có làm cho chúng nhanh hơn khi bạn biết rằng sẽ chỉ có 1 kết quả không?


86

Khi tôi thêm LIMIT 1 vào truy vấn MySQL, nó có dừng tìm kiếm sau khi tìm thấy 1 kết quả (do đó làm cho nó nhanh hơn) hay nó vẫn tìm nạp tất cả các kết quả và cắt bớt ở cuối?


1
Không nếu có UNIQUE(hoặc PRIMARY KEY) ràng buộc (hoặc chỉ mục) trên cột bộ lọc. stackoverflow.com/questions/8467092/…
ma11hew28

Câu trả lời:


81

Tùy thuộc vào truy vấn, việc thêm mệnh đề giới hạn có thể có ảnh hưởng rất lớn đến hiệu suất. Nếu bạn chỉ muốn một hàng (hoặc biết thực tế là chỉ một hàng có thể đáp ứng truy vấn) và không chắc chắn về cách trình tối ưu hóa nội bộ sẽ thực thi nó (ví dụ: mệnh đề WHERE không đánh chỉ mục, v.v.), thì bạn chắc chắn nên thêm điều khoản LIMIT.

Đối với các truy vấn được tối ưu hóa (sử dụng chỉ mục trên các bảng nhỏ), nó có thể không quan trọng nhiều về hiệu suất, nhưng một lần nữa - nếu bạn chỉ quan tâm đến một hàng, hãy thêm một mệnh đề LIMIT bất kể.


30
Vì mục đích kháng cự, bạn có thể muốn xem xét việc gửi LIMIT 2 và sau đó khiếu nại hoặc loại bỏ nếu giả định một hàng của bạn không phù hợp.
Jeffrey Hantin

6
@JeffreyHantin Nếu thực sự có thể chỉ có một, bạn nên thêm một ràng buộc duy nhất vào cơ sở dữ liệu. Gọn gàng hơn nhiều sau đó làm rối mã của bạn bằng các kiểm tra độ tỉnh táo.
Cristian Vrabie,

@CristianVrabie Nếu nó có thể được thể hiện dưới dạng một ràng buộc duy nhất, chắc chắn rồi, nhưng đó là khẳng định về dữ liệu trong bảng. Việc gửi LIMIT 2 và kiểm tra 1 là xác nhận về chính truy vấn, truy vấn này rất có thể chứa lỗi chẳng hạn như điều kiện kết hợp được chỉ định không đầy đủ.
Jeffrey Hantin

1
@JeffreyHantin Đủ công bằng, nhưng ngoại trừ nếu bạn viết mã cho Mars Rover, bạn viết thử nghiệm cho điều này thay vì làm ô nhiễm mã của bạn.
Cristian Vrabie

8
@JeffreyHantin Nếu giả định rằng chỉ có một là đúng, thì việc thêm LIMIT 2 sẽ không giết chết bất kỳ tối ưu hóa nào vì nó sẽ tìm kiếm tất cả các hàng? Thêm LIMIT 2 trong trường hợp đó không tốt hơn (tối ưu hóa) hơn là không thêm gì cả.
Chris Middleton

19

Giới hạn có thể ảnh hưởng đến hiệu suất của truy vấn (xem nhận xét và liên kết bên dưới) và nó cũng làm giảm tập kết quả được xuất ra bởi MySQL. Đối với một truy vấn mà bạn mong đợi một kết quả duy nhất sẽ có lợi ích.

Hơn nữa, việc giới hạn tập kết quả trên thực tế có thể tăng tốc tổng thời gian truy vấn vì việc chuyển các tập kết quả lớn sử dụng bộ nhớ và có khả năng tạo các bảng tạm thời trên đĩa. Tôi đề cập đến vấn đề này vì gần đây tôi đã thấy một ứng dụng không sử dụng giới hạn giết máy chủ do tập hợp kết quả lớn và với giới hạn tại chỗ, việc sử dụng tài nguyên đã giảm xuống rất nhiều.

Kiểm tra trang này để biết thêm chi tiết cụ thể: Tài liệu MySQL: Tối ưu hóa LIMIT


Trang bạn đã liên kết cho biết: "Nếu bạn chỉ chọn một vài hàng có LIMIT, MySQL sử dụng các chỉ mục trong một số trường hợp khi thông thường nó muốn thực hiện quét toàn bộ bảng." Điều đó không giống như bản thân truy vấn luôn được xử lý như bình thường.
che

điểm tốt. Tôi đã tổng hợp hóa dựa trên những quan sát từ việc sử dụng EXPLAIN. Cảm ơn vì đã bắt được.
rjamestaylor

Liên kết được đánh giá cao. FWIW, hầu hết câu trả lời này dường như áp dụng cho các tình huống mà không có Giới hạn, có thể có một tập hợp kết quả lớn . Câu hỏi đặt ra là liệu nó có quan trọng không khi chỉ có 1 hàng được khớp thành công; trong trường hợp "tập hợp kết quả" chỉ là 1 hàng (thậm chí giới hạn w / o).
ToolmakerSteve

5

Nếu chỉ có 1 kết quả trả về, thì không, LIMIT sẽ không làm cho kết quả nhanh hơn. Nếu có nhiều kết quả và bạn chỉ cần kết quả đầu tiên và không có NHÓM hoặc LỆNH theo câu lệnh thì LIMIT sẽ làm cho nó nhanh hơn.


2
Nó cần được nhanh hơn ngay cả với 1 hàng, nếu không có / khóa chính độc đáo, bởi vì nó dừng lại tìm kiếm sau khi sáng lập sự xuất hiện đầu tiên
the_nuts

Kris, câu đầu tiên của bạn có thể được đọc theo một trong hai cách. Nếu ý bạn là "chỉ có thể trả lại 1 hàng" (ví dụ: truy vấn một cột duy nhất), thì điều bạn nói là đúng. OTOH, nếu ý của bạn là "bất cứ khi nào chỉ tìm thấy 1 kết quả trùng khớp" thì giới hạn sẽ không làm cho nó nhanh hơn: bạn có chắc không? Đôi khi nó không tránh phải kéo các trang bổ sung?
ToolmakerSteve

5

Câu trả lời, trong ngắn hạn, là có. Nếu bạn giới hạn kết quả của mình là 1, thì ngay cả khi bạn đang "mong đợi" một kết quả, truy vấn sẽ nhanh hơn vì cơ sở dữ liệu của bạn sẽ không xem qua tất cả các bản ghi của bạn. Nó sẽ chỉ dừng lại khi tìm thấy bản ghi phù hợp với truy vấn của bạn.


1
Câu trả lời này gây hiểu lầm, vì nó thiếu cảnh báo được thấy trong các nhận xét về các câu trả lời khác (7 năm trước đó!) Rằng nếu DB biết rằng chỉ một bản ghi có thể khớp (ví dụ: truy vấn một cột duy nhất), thì Giới hạn 1 sẽ không có hiệu lực.
ToolmakerSteve

Nghiêm túc? Trình tối ưu hóa truy vấn có thể tận dụng thực tế là các điều kiện nhất định đảm bảo rằng chỉ có thể trả về 1 bản ghi. Tôi đã chỉ ra rằng câu trả lời của bạn không đúng trong mọi trường hợp. (Và do đó trừ đi giá trị của những gì đã nói nhiều năm trước đó.) Nếu bạn đồng ý, bạn có thể thừa nhận tính đúng đắn của nhận xét của tôi. Nếu bạn không đồng ý, bạn có thể làm rõ lý do tại sao.
ToolmakerSteve

1

Nếu bạn thực sự chỉ mong đợi một kết quả duy nhất, thì việc nối LIMIT vào truy vấn của bạn thực sự có ý nghĩa. Tôi không biết hoạt động bên trong của MySQL, nhưng tôi chắc chắn rằng nó sẽ không thu thập tập hợp kết quả gồm 100'000 + bản ghi chỉ để cắt ngắn nó trở lại 1 ở cuối ..

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.