MySQL ORDER BY DESC很快但ASC很慢

Pep*_*per 13 mysql performance

我完全被这个困扰了.出于某种原因,当我通过DESC对此查询进行排序时,它的速度非常快,但如果按ASC排序则非常慢.

这大约需要150毫秒:

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;
Run Code Online (Sandbox Code Playgroud)

这大约需要32秒:

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;
Run Code Online (Sandbox Code Playgroud)

EXPLAIN对于两个查询都是相同的.

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  posts   index   NULL    published   5   NULL    50  Using where
Run Code Online (Sandbox Code Playgroud)

我把它追溯到"USE INDEX(已发布)".如果我把它拿出来,那么两种方式都是相同的.但EXPLAIN显示查询整体效率较低.

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
Run Code Online (Sandbox Code Playgroud)

这是桌子.

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;
Run Code Online (Sandbox Code Playgroud)

有没有解决这个问题?谢谢!

SQL*_*ace 5

你的索引是按顺序排序的,所以当你要求升序时,它需要做更多的工作才能按顺序恢复它

  • 我不知道接受的答案实际上是如何回答这个问题的.Pepper声明他的SELECT与`ORDER BY DESC`比`ORDER BY ASC'快*,但索引总是以ASC顺序排序.那么,为什么"ORDER BY DESC"不慢? (8认同)
  • 来自http://dev.mysql.com/doc/refman/5.5/en/create-index.html:index_col_name规范可以以ASC或DESC结尾.这些关键字允许用于指定升序或降序索引值存储的未来扩展.目前,他们被解析但被忽略; 索引值始终按升序存储.那么,我如何创建一个排序desc的索引? (4认同)