Phong cách của bạn rất hiếm gặp.
Hầu hết mọi người có thể sẽ viết WHERE began_at < NOW() AND finished_at > NOW()
Tuy nhiên. Tôi khuyên bạn nên đặt một chỉ mục trên cả hai trường.
Một phím kết hợp sẽ không sử dụng cho bạn vì bạn sẽ chỉ tăng tốc độ tìm kiếm cho các kết hợp ngày cụ thể.
Điều này không hoàn toàn đúng vì nếu bạn sử dụng đồng thời một khóa kết hợp sẽ giúp ích cho bạn nhưng không tốt bằng nếu bạn lập chỉ mục chúng riêng biệt. Các chỉ mục trường SIngle hoạt động tốt hơn trong các yêu cầu ragen.
Bạn có thể google một chút cho "tìm kiếm phạm vi đa chiều".
Lý do là tất cả các trường phù hợp trong một trường về cơ bản có thể được tìm thấy trong log (n) time trong btrees. Vì vậy, thời gian chạy tổng thể của bạn sẽ là O (k * log (n)) là O (log (n)).
Các truy vấn Phạm vi đa chiều có thời gian chạy là O (sqrt (n)) cao hơn. Tuy nhiên, có những cách triển khai tốt hơn cũng làm mất thời gian chạy logarit. Tuy nhiên, chúng không được triển khai đầy đủ trong mysql, vì vậy nó sẽ tệ hơn hoặc tồi tệ hơn tùy thuộc vào phiên bản.
Vì vậy, hãy để tôi tóm tắt:
-
So sánh bình đẳng trên các trường đơn lẻ:chỉ số băm (thời gian chạy O (1))
-
Phạm vi tìm kiếm trên các trường đơn lẻ:chỉ mục btree trên các trường đơn lẻ (O (log (n)))
-
Tìm kiếm bình đẳng trên nhiều trường:khóa băm kết hợp (thời gian chạy O (1))
những trường hợp đó là một điều rõ ràng ...
- Tìm kiếm theo phạm vi trên nhiều trường:chỉ mục btree riêng biệt (O (log (n)))
đây là nơi mà nó không quá rõ ràng. Với các phiên bản hiện tại, rõ ràng là tốt hơn để lập chỉ mục riêng biệt vì những lý do được đưa ra ở trên. bạn cần cho điều đó) kể từ phiên bản 5.0, nhưng chỉ rất hạn chế và trình tối ưu hóa truy vấn chỉ sử dụng chúng trong một số trường hợp hiếm hoi. không biết về các phiên bản mới hơn như 5.3 hay gì đó.
tuy nhiên với việc mysql triển khai các khóa kết hợp chỉ mục lỏng lẻo trên các trường mà bạn thực hiện các yêu cầu phạm vi hoặc sắp xếp theo các hướng khác nhau ngày càng trở nên phù hợp hơn.