2012-07-04 14 views
5

Có ai biết nếu có bất kỳ sự khác biệt tốc độ (rõ ràng cho các bảng có đủ khá lớn) giữa hai truy vấn sau đây:LIMIT LIMIT có tăng tốc độ SELECT trên Khóa chính không?

SELECT field FROM table WHERE primary_key = "a particular value" 

hay:

SELECT field FROM table WHERE primary_key = "a particular value" LIMIT 0,1 

tôi nên lưu ý rằng trường primary_key thực sự là một khóa chính.

Hiện tại LIMIT 0,1 sẽ trợ giúp khi truy vấn thực hiện theo cách khác để tìm các kết quả phù hợp khác. Tôi giả định rằng khi một khóa chính có liên quan, nó sẽ tự động dừng lại do nó là duy nhất. Vì vậy, tôi đoán là sẽ không có bất kỳ lợi ích bằng cách thêm nó.

Bất cứ ai cũng gặp phải điều này trước đây? Tôi không có một tập dữ liệu đủ lớn nằm xung quanh để kiểm tra với tại thời điểm này. Tôi cũng giả định rằng cùng một câu trả lời sẽ áp dụng cho bất kỳ trường nào đã được đặt là UNIQUE.

+5

Bạn có thể tìm thấy điều này reading hữu ích: http://dev.mysql.com/doc/refman/5.0/en/explain-output.html#explain-join-types đặc biệt là tiêu đề "Giải thích tham gia loại " – Hammerite

Trả lời

6

Vì vậy, sau khi đọc những thông tin được cung cấp bởi Hammerite (Cảm ơn cho điều đó) chạy explain trên cả hai truy vấn sản xuất:

  • id = 1
  • select_type = SIMPLE
  • bảng = bảng
  • type = CONST
  • possible_keys = PRIMARY
  • khóa = PRIMARY
  • key_len = 767
  • ref = const
  • rows = 1
  • tắm =

nào xác định cả các truy vấn như CONST, mà vào liên kết xác định như sau:

const

Bảng có nhiều nhất trên e hàng phù hợp, được đọc ở đầu số truy vấn. Vì chỉ có một hàng, các giá trị từ cột trong hàng này có thể được coi là hằng số bởi phần còn lại của trình tối ưu hóa. các bảng const rất nhanh vì chúng chỉ đọc một lần.

Giả sử tôi hiểu cả hai truy vấn một cách chính xác, chúng sẽ được xử lý như nhau - đó là những gì tôi đã mong đợi.

4

Các khóa chính sẽ được tìm kiếm dưới dạng chỉ mục khá nhanh.

Nhưng đặt giới hạn truy vấn của bạn là một phần của các phương pháp hay nhất.

Trên bất kỳ truy vấn phức tạp hơn nó sẽ, với tham gia, Group_by và trật tự bằng hoặc thậm chí tìm kiếm duy nhất, nó cho phép sql để dừng lại, sau khi bạn ROW_COUNT giới hạn kỷ lục được tìm thấy, ví dụ như: 1

Nếu bạn sử dụng theo thứ tự bởi, nó sẽ cho phép sql bắt đầu tìm kiếm một cách thích hợp từ cột theo thứ tự và dừng sau khi tìm thấy 1 bản ghi đó, ngay cả khi các bản ghi khác được tìm thấy trong các cột hoặc điều kiện được chỉ định khác, ví dụ:

SELECT Primary_keycoll,field2 FROM table WHERE Primary_keycoll = "value1" or field2 = 'value1' order by field2 limit 0,1 có thể Primary_keycoll là duy nhất nhưng những người khác ví dụ: field2 có thể không, giới hạn đến 1, cho phép mysql để có được đầu tiên và dừng lại, nếu không nó sẽ đi máng toàn bộ cột hoặc tài nguyên được chỉ định để đảm bảo col khác umns không thực hiện truy vấn.

Sử dụng giới hạn ở phần cuối của câu hỏi của bạn là thực hành tốt vì các lý do an ninh, nó sẽ chặn một số trick SQL injection. miễn là giới hạn của bạn, được khử trùng đúng cách.

http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

+1

+1 Cảm ơn bạn đã thêm thông tin :) - trong khi tôi biết rằng LIMIT sẽ luôn hỗ trợ các truy vấn phức tạp (hoặc không được lập chỉ mục/không phải là duy nhất). Và bây giờ kể từ khi hỏi câu hỏi này, tôi biết về các trường duy nhất về cơ bản sẽ được tự động giới hạn theo mặc định ... Những gì tôi đã không nghĩ đến là những lợi ích có thể có của việc triển khai LIMIT như một sự trợ giúp chống lại SQL injection ... một điểm tốt. – Pebbl

+3

Thông tin tiền thưởng: 'LIMIT 0' sẽ nhanh chóng trả về một tập trống. Điều này có thể được sử dụng để kiểm tra tính hợp lệ của một truy vấn. Nếu truy vấn hợp lệ, bạn sẽ không gặp lỗi, nếu nó không hợp lệ, bạn sẽ nhận được một mô tả về lỗi. Có thể được sử dụng để kiểm tra cú pháp trên các tập dữ liệu lớn. – GuruJR

+1

+1 Tôi nghĩ rằng bạn đã lập luận rằng bạn nên sử dụng LIMIT 0,1 nếu bạn có thể ... và sử dụng LIMIT 0 nếu bạn muốn kiểm tra tính hợp lệ của truy vấn. điểm đẹp. – Pebbl