Trong truy vấn đầu tiên của bạn, ORDER BY được thực hiện bằng cách sử dụng views_point
INDEX, vì nó được sử dụng trong phần WHERE của truy vấn và do đó trong MySQL có thể được sử dụng để sắp xếp.
Trong truy vấn thứ hai, MySQL giải quyết phần WHERE bằng cách sử dụng một chỉ mục khác, listing_pcs
. Điều này không thể được sử dụng để thỏa mãn điều kiện ORDER BY. MySQL sử dụng filesort để thay thế, đây là tùy chọn tốt nhất nếu không thể sử dụng chỉ mục.
MySQL chỉ sử dụng các chỉ mục để sắp xếp nếu chỉ mục giống với chỉ mục được sử dụng trong điều kiện WHERE. Đây là nội dung hướng dẫn sử dụng nghĩa là:
Vậy bạn có thể làm gì:
-
Thử tăng
sort_buffer_size
của bạn tùy chọn cấu hình để làm cho việc phân loại tệp hiệu quả nhất có thể. Kết quả lớn quá lớn đối với bộ đệm sắp xếp khiến MySQL chia nhỏ việc sắp xếp thành nhiều phần, điều này sẽ chậm hơn. -
Buộc MySQL chọn một chỉ mục khác. Cần lưu ý rằng các phiên bản MySQL khác nhau chọn các chỉ mục mặc định khác nhau. Ví dụ:phiên bản 5.1 khá tệ vì Trình tối ưu hóa truy vấn đã được viết lại rất nhiều cho bản phát hành này và cần nhiều cải tiến. Phiên bản 5.6 khá tốt.
SELECT * FROM listings FORCE INDEX (views_point) WHERE (`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 00:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' )) AND (published =1) AND cat_id IN ( 1, 2, 3, 4, 5 ) ORDER BY `views_point` DESC LIMIT 10