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)
有没有解决这个问题?谢谢!
你的索引是按顺序排序的,所以当你要求升序时,它需要做更多的工作才能按顺序恢复它
归档时间: |
|
查看次数: |
11572 次 |
最近记录: |