2009-11-11 79 views
1

我想讓MySQL使用索引對這些行進行排序。MySQL ORDER BY範圍優化

SELECT 
    identity_ID 
FROM 
    identity 
WHERE 
    identity_modified > 1257140905 
ORDER BY 
    identity_modified 

但是,這是使用文件排序(不受歡迎)。

現在,如果我在此放棄ORDER BY子句,那麼僅僅因爲使用索引來滿足WHERE子句而將行排序爲

因此,我可以通過關閉WHERE子句來獲得我想要的行爲,但是我依靠MySQL的行爲來保持行的一致性,並且如果MySQL發生更改,將來可能會出現問題其內部行爲。

我該怎麼辦?任何告訴MySQL的方式,因爲索引是按順序存儲的(b-tree),它不需要這個文件夾?

表看起來像這樣(簡化):

CREATE TABLE IF NOT EXISTS `identity` (
    `identity_ID`  int(11) NOT NULL auto_increment, 
    `identity_modified` int(11) NOT NULL, 
    PRIMARY KEY   (`identity_ID`), 
    KEY     `identity_modified` (`identity_modified`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 
+0

讓我在這裏清楚我的理解,你想排序identity_modified,但不是其他領域?或即時錯過了點 – Treby 2009-11-11 05:42:14

+0

重點是,我想檢索自某個日期以來修改的所有記錄,按它們上次修改的日期排序。我不希望MySQL必須爲此做一個文件夾;它可能需要對大部分表格進行排序。由於MySQL按順序存儲索引行,因此不應該使用文件夾。 – thomasrutter 2009-11-11 05:48:57

+0

你可以發佈這個查詢的解釋和沒有秩序和。對我來說,它要麼進行全面掃描和排序,要麼使用索引而不排序(取決於提取的記錄數量)。 – Pomyk 2009-11-18 10:25:00

回答

0

的解決方案,我至今是離開關ORDER BY條款,並添加FORCE INDEX (identity_modified)到查詢。這在理論上應該確保這些行按照它們存儲在索引中的順序返回。

這可能不是最佳實踐這樣做的方法,但它似乎是唯一的方式,我想要的方式工作。

0

如果更改了表類型INNODB不會有一個文件排序

ALTER TABLE mydbidentity ENGINE = INNODB;

但我不相信有您的查詢的問題: http://forums.mysql.com/read.php?24,10738,10785#msg-10785

運行你之前和手術後EXPLAIN原始查詢。

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

+0

是的,它在該列上有一個索引。它使用WHERE子句的索引,但不使用索引進行排序。 – thomasrutter 2009-11-11 06:34:35

+0

你可以創建一個腳本,以便我們可以重新創建表格嗎? 查詢上面是完整的還是缺少的東西? – orjan 2009-11-11 07:40:49

+0

添加表def以提問。是的,上面的查詢是完整的 - 我需要的是按修改日期順序的identity_ID值,其中修改日期大於特定值。 – thomasrutter 2009-11-11 23:04:33