我有一个查询,从~10,000的表中提取5条记录。 order
子句不包含在索引中,但where
子句是。{1}}子句。
查询扫描大约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
已编入索引。
答案 0 :(得分:3)
“is_published = 1”适用多少行? 我认为那就像... 7.700行?
无论采用哪种方式,都必须获取与WHERE子句匹配的完整结果,并按所有排序条件对其进行完全排序。然后,在前5个结果之后,将截断所有已排序的已发表文章的完整列表。
也许它会帮助您查看有关ORDER BY优化的MySQL documentation article,但对于第一个,您应该尝试在ORDER BY语句中声明的列上应用索引。这很可能会大大加快速度。
答案 1 :(得分:0)
执行OPTIMIZE TABLE可能无济于事,但也不会有任何伤害。
答案 2 :(得分:0)
订购时,您必须遍历所有btree才能找到正确的订单。
要订购的10,000条记录并不是一件值得担心的事情。请记住,通过正确的索引,RDBMS不会获取整个记录来计算顺序。它具有保存在磁盘上的btree页面中的索引列,并且几乎没有页面读取,整个btree被加载到内存中并且可以遍历。
答案 3 :(得分:0)
在MySQL中,您可以创建包含多个列的索引。我认为您可能需要做的是创建一个包含is_published和published_date的索引。您应该查看EXPLAIN语句的输出以确保它以智能方式执行操作,如果不是,则添加索引。