2010-07-19 33 views
7

Tôi có một truy vấn có thể được thể hiện bằng 2 cách khác nhau với cùng kết quả. Cái nào tốt hơn - cho hiệu suất hoặc các lý do khác?Truy vấn mySQL date nào hoạt động tốt hơn?

truy vấn đầu tiên:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01 00:00:00' AND '2010-12-31 23:59:59' 

Thứ hai truy vấn:

SELECT post_id FROM posts 
    WHERE YEAR(post_date)=2010 

Cảm ơn trước.


Sau khi đề xuất cho điểm chuẩn Tôi đã có một số tìm kiếm và kiểm tra. Bài kiểm tra của tôi không phải là điểm chuẩn vì một số vấn đề trên máy tính của tôi nhưng họ đã cho tôi một số ý tưởng.

Tôi đã kiểm tra bảng xếp hàng 4000 của mình và không có sự khác biệt quan trọng nào. BETWEEN lệnh chỉ là 0,01-0,02 giây hơn YEAR (post_date) tại 0,09 tổng thời gian truy vấn. Có vẻ như sử dụng YEAR (post_date) sẽ tốt cho cả hiệu suất và khả năng sử dụng.

Và tôi đã học được rằng trong khi tìm kiếm; nếu giờ hoặc vài phút là không quá quan trọng, GIỮA thể được sử dụng như thế này:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01' AND '2010-12-31' 
+6

tại sao bạn không tự đánh giá nó? – dbemerlin

+0

Lưu ý: 'GIỮA '2010-01-01' VÀ '2010-12-31'' làm điều gì đó * hơi * đáng ngạc nhiên: không bao gồm ngày cuối cùng, vì nó được mở rộng nội bộ thành' GIỮA' 2010-01-01 00 : 00: 00 'AND' 2010-12-31 00: 00: 00'' – Piskvor

+1

@dbemerlin: Bởi vì những người khác (như tôi) có thể đến xem câu trả lời và kết quả của người khác. –

Trả lời

8

Nếu bạn có chỉ mục trên post_date (tôi khuyên bạn nên sử dụng truy vấn này thường xuyên), sau đó truy vấn BETWEENcan use it. Khi bạn đặt một cột vào một hàm (YEAR(post_date)), MySQL không còn sử dụng chỉ mục của cột nữa, vì vậy nó phải đi qua tất cả các hàng (được gọi là full table scan).

Kiểm tra kết quả của EXPLAIN SELECT với truy vấn của bạn (check this tutorial) và xem kết quả bạn sẽ nhận được - nếu có chỉ mục khả dụng, bạn sẽ thấy sự khác biệt rõ ràng.

Tất nhiên, chuẩn mã của bạn và tự mình xem - nhưng nói chung, việc sử dụng các hàm trong WHERE chậm hơn.

+0

cảm ơn Piskvor. Tôi đã tìm kiếm và chỉnh sửa câu hỏi của mình. FYI – Kemal

+0

Bạn được chào đón. Tại 4000 hàng, sự khác biệt thực sự không liên quan. – Piskvor

2

Bạn có thể sử dụng các hồ sơ truy vấn để xem chính xác bao lâu mỗi người mất:

http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html

Để được chính xác , tất nhiên bạn sẽ muốn kiểm tra từng lần một lần và đảm bảo không có gì khác đang chạy trên hệ thống.

Hãy chắc chắn để quay trở lại đây với câu trả lời của bạn :)

+0

cảm ơn David. Tôi đã tìm kiếm và chỉnh sửa câu hỏi của mình. FYI – Kemal

0

Tôi đồng ý với các áp phích khác - chỉ cần thử nó, vì bạn có cả truy vấn có sẵn. Không có thử nghiệm nào tốt hơn thế.

Nếu tôi phải đoán (đó luôn là ý tưởng tồi!) Nhanh hơn, tôi sẽ nói, nếu post_date được lập chỉ mục, thì đầu tiên sẽ nhanh hơn vì nó có thể sử dụng chỉ mục để truy xuất các hàng phù hợp . Nếu không có chỉ mục, thì bất kỳ sự khác biệt nào giữa hai chỉ số sẽ là biên.

+0

Cảm ơn bạn đã trả lời mdma – Kemal

1

Như những người khác nói, bạn có thể tự đo lường hiệu suất tương đối.

SELECT post_id FROM posts WHERE YEAR(post_date)=2010 

dễ đọc hơn người khác và trừ khi hiệu suất là một vấn đề tôi luôn đi với điều đó.

+1

Điểm tốt - có thể đọc được, nhưng quy mô nó không; trên một vài nghìn hàng, các vấn đề hiệu suất bạn có thể có;) – Piskvor

+0

Tôi nghĩ rằng tôi cũng sẽ chọn này^_ ^ – Kemal

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