2011-03-22 44 views
0

我有如下表:爲什麼如果我查詢更多列,MYSQL不會使用相同查詢的索引?

create table stuff (
     id mediumint unsigned not null auto_increment primary key, 
     title varchar(150) not null, 
     link varchar(250) not null, 
     time timestamp default current_timestamp not null, 
     content varchar(1500) 
); 

如果我解釋查詢

select id from stuff order by id; 

然後它說,使用他們的主鍵訂購結果的指標。但有了這個查詢:

select id,title from stuff order by id; 

EXPLAIN說沒有可能的鍵,它訴諸於filesort。

這是爲什麼?不是某個行的數據一起存儲在數據庫中嗎?如果它只能在查詢id時使用索引來排序結果,那麼爲什麼在查詢中添加其他列會產生影響?主鍵已經確定了該行,所以我認爲它應該在第二種情況下使用主鍵進行排序。

你能解釋一下爲什麼這是不是這樣的?

+0

我不知道答案,但在這裏是如何工作的.. http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – DhruvPathak 2011-03-22 06:07:09

+0

沒有的情況下,列出索引無法使用的地方似乎適用於此。 – Tom 2011-03-22 06:35:48

+0

如果您想了解更多有關這些內容的內容而不會深入瞭解,可能會對開發人員感興趣[SQL索引教程(涵蓋MySQL)](http://use-the-index-luke.com/)。您的特定問題在第一章 - [索引解析](http://use-the-index-luke.com/de/sql/anatomy)中得到解答。 – 2011-03-22 07:02:16

回答

2

當然,因爲它是在此查詢具有更好的性能:你需要閱讀完整的索引和數據讀取反覆按行之後。這是非常沒有效率的。取而代之的是,mysql只是喜歡從數據文件中讀取數據。

而且,你用什麼樣的存儲引擎?看起來像mysam。

對於這種情況的InnoDB會更有效,因爲它使用了主鍵聚簇索引(這是單調你的情況越來越多)。

+0

好吧,但是爲什麼在它從數據文件中檢索數據後,它不使用索引來按順序返回行?將數據讀入內存,然後使用索引迭代地返回行。使用一個已經排序的索引文件來做它會比將所有的行分檔更快,不是嗎? – Tom 2011-03-22 06:40:33

+0

@Tom:如果是這樣 - mysql會這樣做;-)因爲它沒有 - 它不會更快。你有多少行?對於<約10k的數量,使用filesort進行排序的速度非常快。這種查詢的索引可能是無用的。 – zerkms 2011-03-22 06:43:49

+0

這不是一個大表,所以它不是性能問題。你說如果表增長,比如說,100k行,那麼MySQL將使用索引文件?解釋的結果是否取決於表的大小? – Tom 2011-03-22 06:46:24

相關問題