MySQL Slow Order BY в столбце индекса - PullRequest
3 голосов
/ 06 ноября 2011

У меня есть таблица (book_list), в которой около 4 миллионов записей.У него есть PK (book_list_id), и когда я запускаю запрос, как показано ниже, я получаю результаты обратно в .060s

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

Теперь, когда я запускаю практически тот же запрос, но сортирую по book_title, который является varchar (1200)и индексируется, это занимает 34,7 с

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

Есть ли что-то, что я могу сделать, чтобы сделать это второе утверждение быстрее?

Кстати, я также пытался сортировать по другим числовым индексированным полям, и они тожеочень медленно.Похоже, что только сортировка по ПК дает быстрые результаты.

Вот таблица создания:

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

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Плохая производительность связана с тем, что индексируются не все поля, только первые 255 символов.RDBS должен сравнивать 1200-255 символов, чтобы сделать окончательный порядок.

Увеличьте часть индексированного поля или сделайте запрос для сортировки только по первым 255 символам, как @Dmitry Beransky говорит: 'order by left (book_title255)

0 голосов
/ 07 ноября 2011

Не могли бы вы попробовать:

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