Đối với truy vấn:
WHERE NOW() >= date_from
AND NOW() <= date_to
Một số hợp chất (date_from, date_to)
là vô ích.
Tạo cả hai chỉ mục: (date_from)
và (date_to)
và để trình tối ưu hóa SQL quyết định mỗi lần sử dụng. Tùy thuộc vào giá trị và chọn lọc, trình tối ưu hóa có thể chọn một hoặc một chỉ mục khác. Hoặc không ai trong số họ. Không có cách nào dễ dàng để tạo ra một chỉ mục sẽ xem xét cả hai điều kiện.
(Chỉ số không gian có thể được sử dụng để tối ưu hóa điều kiện như vậy, nếu bạn có thể dịch ngày sang vĩ độ và kinh độ).
Cập nhật
Sai lầm của tôi. Chỉ mục trên (date_from, date_to, object_id)
có thể và thực sự được sử dụng trong một số trường hợp cho truy vấn này. Nếu độ chọn lọc của NOW() <= date_from
đủ cao, trình tối ưu hóa chọn sử dụng chỉ mục này, hơn là quét toàn bộ trên bảng hoặc sử dụng một chỉ mục khác. Điều này là bởi vì nó là một chỉ số bao gồm, có nghĩa là không có dữ liệu là cần thiết để được lấy từ bảng, chỉ đọc từ dữ liệu chỉ mục được yêu cầu.
Ghi chú nhỏ (không liên quan đến hiệu suất, chỉ tính đúng của truy vấn). tình trạng của bạn là tương đương với:
WHERE CURRENT_DATE() >= date_from
AND (CURRENT_DATE() + INTERVAL 1 DAY <= date_to
OR (CURRENT_DATE() = NOW()
AND CURRENT_DATE() = date_to
)
)
Bạn có chắc chắn bạn muốn điều đó hay bạn muốn điều này:
WHERE CURRENT_DATE() >= date_from
AND CURRENT_DATE() <= date_to
Chức năng NOW()
trả về một DATETIME
, trong khi CURRENT_DATE()
trả về một DATE
, mà không có sự bán thời gian.
Nguồn
2012-02-17 16:57:24
Tôi cảm thấy date_from là tốt hơn để tạo chỉ mục thay vì kết hợp –
Bạn [có thể] cảm thấy sai. Giả sử có 10 hàng cho một số đối tượng. 8 có ngày kết thúc trong quá khứ, 1 là "hiện tại" và 1 là "tương lai". Có bao nhiêu trong số đó được lọc bởi "NOW()> date_from" (câu trả lời: chỉ một) và số lượng được lọc theo "NOW()