2011-11-06 58 views
3

我有一個表(book_list),其中有大約400萬條記錄。它有一個PK(book_list_id),當我運行查詢像下面我得到的結果早在.060sMySQL緩慢訂單索引列

select * from book_list bl ORDER BY bl.book_list_id LIMIT 25 

現在,當我運行幾乎相同的查詢,但BOOK_TITLE這是VARCHAR(1200)排序,並索引,它需要34.7 s

select * from book_list bl ORDER BY bl.book_title LIMIT 25 

有什麼我可以做的,使第二個聲明更快?

順便說一句我也嘗試了其他數字索引字段排序,他們也很慢。只有PK排序才能產生快速結果。

下面是創建表:

CREATE TABLE `book_list` (

`book_list_id` int(11) NOT NULL AUTO_INCREMENT, 

`book_title` varchar(1200) CHARACTER SET utf8 DEFAULT NULL 
PRIMARY KEY (`book_list_id`), 

KEY `indx_book_title` (`book_title`(255)) 

) 
ENGINE=InnoDB AUTO_INCREMENT=4733798 DEFAULT CHARSET=latin1 
+0

請,展後創建表。 – danihp

+3

runing'explain ...'會告訴你什麼? –

+0

你有4百萬冊索引書嗎? ;) – danihp

回答

1

不良表現都非常由於這樣的事實,並非所有的字段建立索引,只有首創255個字符。 RDBS必須比較1200-255個字符才能完成最終訂單。

增加被索引的字段的部分或使查詢只能由首創255個字符作爲@Dmitry Beransky排序說:「由左的順序(BOOK_TITLE,255)」

+0

解決了這個問題。謝謝! – chrisg229

-2

能不能請你:

select * from book_list where book_list_id in 
(select book_list_id from book_list order by book_title limit 25); 
+0

這會導致以下錯誤:[Err] 1235 - 此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查詢' – chrisg229