2011-02-26 19 views
1

我想显示10个最新的论坛主题,我通过订购日期ASC来完成。我把日期索引,然而,它仍然得到所有行检查(我使用EXPLAIN来看看)。ORDER BY使用所有行

问题是什么,或者如果没有看到我的表格就看不到它?

谢谢。

+0

有很多事情可以影响这一点。列别名,WHERE子句中的OR语句等等...你在使用LIMIT吗?我们可以看到EXPLAIN的查询和输出吗? – McAden 2011-02-26 20:56:18

+0

@McAden:是的,我使用限制 – 2011-02-26 20:59:33

+0

在没有太多行的表上,全表扫描可能比索引扫描+从表中获取数据便宜。 – 2011-02-26 21:00:32

回答

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 

这2要求会比一个完整的扫描速度更快,如果你的表有很多行,肯定会产生相同的结果,如果你的主键是自动递增。

我希望这将有助于你

杰罗姆·瓦格纳

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