2011-11-06 47 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