我有一个查询,它从一个大约10,000的表中提取5条记录。索引不包含order子句,但包含where子句。
该查询扫描大约7,700行来提取这5个结果,这似乎有点多。然而,我理解排序标准的复杂性使问题变得复杂。如何才能减少扫描的行数?
该查询如下所示:
SELECT *
FROM `mediatypes_article`
WHERE `mediatypes_article`.`is_published` = 1
ORDER BY `mediatypes_article`.`published_date` DESC, `mediatypes_article`.`ordering` ASC, `mediatypes_article`.`id` DESC LIMIT 5;medaitypes_article.is_published已编入索引。
发布于 2009-11-23 14:59:44
"is_published = 1“有多少行?我想这就像是..。7.700行?
无论采用哪种方式,都必须获取与WHERE子句匹配的full结果,并按照所有排序标准对其进行完全排序。然后,所有排序的已发表文章的完整列表将在前5个结果之后截断。
查看有关ORDER BY优化的MySQL documentation article可能会对您有所帮助,但对于第一个优化,您应该尝试对ORDER BY语句中声明的列应用索引。这很可能会大大加快速度。
发布于 2009-11-23 15:05:59
执行OPTIMIZE TABLE可能没有帮助,但也无伤大雅。
发布于 2009-11-23 15:10:53
当你有排序的时候,你必须遍历所有的btree来找出正确的顺序。
要订购10,000条记录并不是很大的问题。请记住,使用适当的索引,RDBMS不会获取整个记录来确定顺序。它将btree页面中的索引列保存在磁盘上,并且只需很少的页面读取,整个btree就会加载到内存中并可以遍历。
https://stackoverflow.com/questions/1781478
复制相似问题