ORDER BY使用所有行

时间:2011-02-26 20:48:23

标签: mysql optimization

我想展示10个最新论坛主题,我通过订购ASC日期来做。我把索引放在日期上,但是,它仍然会检查所有行(我使用EXPLAIN来查看)。

问题是什么,或者看不到我的桌子就看不到它?

谢谢。

2 个答案:

答案 0 :(得分:1)

取决于索引的类型,按日期排序需要完整扫描。我认为你用mysql做不了多少。

然而,一个解决方案是使用WHERE子句“剪切”搜索。例如

WHERE date > 10 days ago

在完整扫描时不会进行排序,而是在WHERE子句之后剩下的内容。

可能看起来很奇怪,并且根据您的表格,您可以使用... 2个查询来优化查询。例如:

SELECT max(primary key) from topics => $max

SELECT topic from topics where primary key >= $max - 10
如果您的表有很多行,那么这两个请求将比完全扫描更快,如果您的主键是自动递增,肯定会给出相同的结果。

我希望这会对你有所帮助

Jerome Wagner

答案 1 :(得分:0)

你所描述的内容应该有效,但很容易被打破http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html列出了它可以破解的原因。没有看到你的SQL,我不知道你在做什么。但是,这是一个如何使这项工作的例子:

SELECT topic
FROM forum_posts
ORDER BY some_date DESC
LIMIT 10

如果您有一个更复杂的查询可以打破这个问题,您可以加入此查询以过滤结果并保存工作。例如。

SELECT f.topic
  , o.some_information
  , some_date
FROM (
    SELECT id, topic, some_date
    FROM forum_posts
    ORDER BY some_date DESC
    LIMIT 10
  ) f
  JOIN other_table o
    ON o.forum_id = f.id
ORDER BY some_date DESC