Truy vấn này:
SELECT *
FROM listings
WHERE (publishedon BETWEEN 1441105258 AND 1443614458) AND
(published = 1) AND
(cat_id in (1,2,3,4,5)) AND
(source_id in (1,2,3,4,5));
Rất khó để tối ưu hóa chỉ với các chỉ mục. Chỉ mục tốt nhất là chỉ mục bắt đầu bằng published
và sau đó là các cột khác - không rõ thứ tự của chúng phải như thế nào. Lý do là vì tất cả ngoại trừ published
không sử dụng =
.
Bởi vì vấn đề hiệu suất của bạn là về một loại, điều đó cho thấy rằng rất nhiều hàng đang được trả về. Thông thường, một chỉ mục được sử dụng để đáp ứng WHERE
trước khi chỉ mục có thể được sử dụng cho ORDER BY
. Điều đó làm cho điều này khó tối ưu hóa.
Gợi ý. . . Không có cái nào tuyệt vời như vậy:
- Nếu bạn định truy cập dữ liệu theo tháng, thì bạn có thể xem xét phân vùng dữ liệu theo tháng. Điều đó sẽ làm cho truy vấn không có
ORDER BY
nhanh hơn, nhưng sẽ không giúp đượcORDER BY
. - Thử các thứ tự cột khác nhau sau khi
published
trong chỉ mục. Bạn có thể tìm thấy (các) cột chọn lọc nhất. Tuy nhiên, một lần nữa, điều này sẽ tăng tốc truy vấn trước khi sắp xếp. - Hãy nghĩ về các cách mà bạn có thể cấu trúc truy vấn để có nhiều điều kiện bình đẳng hơn trong
WHERE
hoặc để trả về một tập dữ liệu nhỏ hơn. - (Không thực sự được khuyến nghị) Đặt một chỉ mục trên
published
và cột đặt hàng. Sau đó, sử dụng một truy vấn con để tìm nạp dữ liệu. Đặt các điều kiện bất bình đẳng (IN
và như vậy) trong truy vấn bên ngoài. Truy vấn con sẽ sử dụng chỉ mục để sắp xếp và sau đó lọc kết quả.
Lý do cuối cùng không được khuyến khích là vì SQL (và MySQL) không đảm bảo thứ tự kết quả từ một truy vấn con. Tuy nhiên, vì MySQL hiện thực hóa các truy vấn con nên kết quả thực sự theo thứ tự. Tôi không thích sử dụng các tác dụng phụ không có giấy tờ, có thể thay đổi từ phiên bản này sang phiên bản khác.