2010-09-10 140 views
4

我得到了關於MySQL辛辣的問題...MySQL的:最佳實踐來獲得最後一個記錄

這裏的想法是選擇第n從表中最後一個記錄,由物業過濾,(可能來自另一個表) 。那很簡單。

在這一點上,你想回復:

設N = 10

SELECT * 
    FROM huge_table 
    JOIN another_table 
     ON another_table.id = huge_table.another_table_id 
     AND another_table.some_interesting_property 
    ORDER BY huge_table.id DESC 
    LIMIT 10 

沒有JOIN沒關係,MySQL的讀取結束索引和特羅我10個項目,執行時間是可以忽略不計 通過連接,執行時間取決於表的大小,並且在許多情況下不可忽略,解釋說明mysql是:「Using where; Using index; Using temporary; Using filesort」

MySQL文檔http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html)指出:

「您正在連接多個表,並且ORDER BY中的列不是全部來自用於檢索行的第一個非常數表。 (這是EXPLAIN輸出的第一個表中沒有一個const聯接類型)。」

解釋爲什麼MySQL不能使用索引來解決我的ORDER BY prefering一個巨大的文件排序...

我的問題是:使用ORDER BY ... LIMIT 10獲得最後的物品是否很自然?你是否真的在按照升序排列的卡片組中挑選最後的10張卡片?我個人從底部挑選10張卡片..

我嘗試了很多可能性,但都結束了,結論是我很快查詢了10個第一個元素,而且查詢ORDER BY子句的最後一個原因的速度很慢。

「Select last 10」真的會很快嗎?我錯在哪裏?

+0

「AND another_table.some_interesting_property」是與編輯前的值相比較的嗎? – 2010-11-29 21:18:44

回答

0

不錯的問題,我認爲你應該按列進行排序,即id爲DESC索引。
這應該做的伎倆。
http://dev.mysql.com/doc/refman/5.0/en/create-index.html

+0

在您的鏈接中:index_col_name規範可以以ASC或DESC結尾。這些關鍵字可用於將來的擴展,用於指定升序或降序索引值存儲。目前,他們被解析但被忽略;索引值始終以升序存儲。 – 2010-09-10 13:28:33

+0

哦,錯過了。 – shikhar 2010-09-10 13:54:26

0

我很難再現您的情況。無論我使用ASC還是DESC與我的huge_table/another_table模擬,我的EXPLAIN和執行時間都顯示大約N行讀取和邏輯連接。您使用的是哪個版本的MySQL?

此外,從EXPLAINdoc,它指出Using index表示

列的信息是從使用索引樹僅信息表中檢索,而不需要做額外的努力讀取實際行

這不符合你正在做的事實SELECT *,除非你有一個索引涵蓋整個表。

也許你應該顯示你的模式,包括索引和EXPLAIN輸出。

+0

MySQL 5.0,在你的情況下,EXPLAIN顯示「USING INDEX」? – 2010-11-19 08:38:36

+0

我的輸出不顯示「使用索引」 – Riedsio 2010-12-02 16:19:08

0

通過連接,您現在將行限制爲「some_interesting_property」,並且您的huge_table中的ID可能不再連續......嘗試索引another_table(some_interesting_property,id)以及huge_table(another_table_id,id)和看看你的EXPLAIN能否給你提供更好的提示。