2011-02-26 18 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