У меня невероятно простой запрос (тип таблицы InnoDb) и EXPLAIN
говорит, что MySQL должен выполнить дополнительный проход, чтобы узнать, как получить строки в отсортированном порядке.
SELECT * FROM `comments`
WHERE (commentable_id = 1976)
ORDER BY created_at desc LIMIT 0, 5
вывод точного объяснения:
table select_type type extra possible_keys key key length ref rows
comments simple ref using where; using filesort common_lookups common_lookups 5 const 89
commentable_id индексируется. В комментариях нет ничего трюка, просто в области содержимого.
В пособии указано, что если порядок отличается от того, где нет, то файлопорта можно избежать.
http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Я также пробовал заказ по id, а также его эквивалент, но не имеет значения, даже если я добавляю id в качестве индекса (который, как я понимаю, не требуется, поскольку id индексируется неявно в MySQL).
заблаговременно за любые идеи!
Отметить - здесь SHOW CREATE TABLE
CREATE TABLE `comments` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL,
`commentable_type` varchar(255) default NULL,
`commentable_id` int(11) default NULL,
`content` text,
`created_at` datetime default NULL,
`updated_at` datetime default NULL,
`hidden` tinyint(1) default '0',
`public` tinyint(1) default '1',
`access_point` int(11) default '0',
`item_id` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `created_at` (`created_at`),
KEY `common_lookups` (`commentable_id`,`commentable_type`,`hidden`,`created_at`,`public`),
KEY `index_comments_on_item_id` (`item_id`),
KEY `index_comments_on_item_id_and_created_at` (`item_id`,`created_at`),
KEY `index_comments_on_user_id` (`user_id`),
KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31803 DEFAULT CHARSET=latin1