Tôi hoàn toàn bối rối về điều này. Đối với một số lý do khi tôi sắp xếp truy vấn này bởi DESC nó siêu nhanh, nhưng nếu được sắp xếp theo ASC thì nó rất chậm.MySQL ORDER BY DESC là nhanh nhưng ASC là rất chậm
này mất khoảng 150 mili giây:
SELECT posts.id
FROM posts USE INDEX (published)
WHERE posts.feed_id IN (4953,622,1,1852,4952,76,623,624,10)
ORDER BY posts.published DESC
LIMIT 0, 50;
này mất khoảng 32 giây:
SELECT posts.id
FROM posts USE INDEX (published)
WHERE posts.feed_id IN (4953,622,1,1852,4952,76,623,624,10)
ORDER BY posts.published ASC
LIMIT 0, 50;
Các GIẢI THÍCH là như nhau cho cả hai câu truy vấn.
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts index NULL published 5 NULL 50 Using where
Tôi đã theo dõi nó xuống "SỬ DỤNG INDEX (đã xuất bản)". Nếu tôi lấy nó ra thì đó là cùng một hiệu suất theo cả hai cách. Nhưng giải thích cho thấy truy vấn là tổng thể kém hiệu quả hơn.
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts range feed_id feed_id 4 \N 759 Using where; Using filesort
Và đây là bảng.
CREATE TABLE `posts` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`feed_id` int(11) NOT NULL,
`post_url` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
`content` blob,
`author` varchar(255) DEFAULT NULL,
`published` int(12) DEFAULT NULL,
`updated` datetime NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `post_url` (`post_url`,`feed_id`),
KEY `feed_id` (`feed_id`),
KEY `published` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=196530 DEFAULT CHARSET=latin1;
Có khắc phục sự cố này không? Cảm ơn!
Cảm ơn bạn đã giải thích. có cách sửa nào cho nó không? Tôi đang suy nghĩ về việc sử dụng 2 truy vấn khác nhau, cái này cho DESC và một cái khác cho ASC. – Pepper
Nếu bạn đang sử dụng mysql 5+, bạn sẽ có thể xác định nhiều chỉ mục. –
Từ http://dev.mysql.com/doc/refman/5.5/vi/create-index.html: Đặc tả index_col_name có thể kết thúc bằng ASC hoặc DESC. Các từ khóa này được phép cho các tiện ích mở rộng trong tương lai để chỉ định bộ nhớ giá trị chỉ mục tăng dần hoặc giảm dần. Hiện tại, chúng được phân tích cú pháp nhưng bị bỏ qua; giá trị chỉ mục luôn được lưu trữ theo thứ tự tăng dần. Vì vậy, làm cách nào tôi có thể tạo chỉ mục được sắp xếp desc? – a1ex07