我想顯示10個最新的論壇主題,我通過訂購日期ASC來完成。我把日期索引,然而,它仍然得到所有行檢查(我使用EXPLAIN來看看)。ORDER BY使用所有行
問題是什麼,或者如果沒有看到我的表格就看不到它?
謝謝。
我想顯示10個最新的論壇主題,我通過訂購日期ASC來完成。我把日期索引,然而,它仍然得到所有行檢查(我使用EXPLAIN來看看)。ORDER BY使用所有行
問題是什麼,或者如果沒有看到我的表格就看不到它?
謝謝。
根據索引的類型,按日期排序需要全面掃描。我認爲你不能用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要求會比一個完整的掃描速度更快,如果你的表有很多行,肯定會產生相同的結果,如果你的主鍵是自動遞增。
我希望這將有助於你
傑羅姆·瓦格納
你所描述的應該工作,但真的很容易打破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
有很多事情可以影響這一點。列別名,WHERE子句中的OR語句等等...你在使用LIMIT嗎?我們可以看到EXPLAIN的查詢和輸出嗎? – McAden 2011-02-26 20:56:18
@McAden:是的,我使用限制 – 2011-02-26 20:59:33
在沒有太多行的表上,全表掃描可能比索引掃描+從表中獲取數據便宜。 – 2011-02-26 21:00:32