Ich bin völlig auf diesem einen ratlos. Aus irgendeinem Grund, wenn ich diese Abfrage nach DESC sortiere, ist es super schnell, aber wenn es nach ASC sortiert wird, ist es extrem langsam.MySQL ORDER BY DESC ist schnell, aber ASC ist sehr langsam
Dieser Vorgang dauert ca. 150 Millisekunden:
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;
Dieser Vorgang dauert ca. 32 Sekunden:
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;
Die EXPLAIN ist die gleiche für beide Abfragen.
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts index NULL published 5 NULL 50 Using where
Ich habe es auf "USE INDEX (veröffentlicht)" gefunden. Wenn ich das herausnehme, ist es die gleiche Leistung in beiden Richtungen. Aber das EXPLAIN zeigt, dass die Abfrage insgesamt weniger effizient ist.
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
Und hier ist der Tisch.
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;
Gibt es eine Lösung dafür? Vielen Dank!
Danke für die Erklärung. Gibt es eine Lösung dafür? Ich denke über die Verwendung von 2 verschiedenen Abfragen, diese für DESC und eine andere für ASC. – Pepper
Wenn Sie MySQL 5+ verwenden, sollten Sie in der Lage sein, mehrere Indizes zu definieren. –
Von http://dev.mysql.com/doc/refman/5.5/de/create-index.html: Eine index_col_name-Spezifikation kann mit ASC oder DESC enden. Diese Schlüsselwörter sind für zukünftige Erweiterungen zum Angeben des aufsteigenden oder absteigenden Indexwertspeichers zulässig. Derzeit werden sie analysiert, aber ignoriert. Indexwerte werden immer in aufsteigender Reihenfolge gespeichert. Also, wie kann ich einen Index erstellen, der desc sortiert ist? – a1ex07