У меня есть следующий запрос, чтобы получить наиболее просматриваемые статьи, представленные в прошлом месяце, например.Оптимизировать порядок MySQL по запросу
explain
SELECT *
FROM article
WHERE date > 1315391769
ORDER BY views DESC
LIMIT 10
Как выбрать правильный индекс для этого запроса? или как его переписать, чтобы избежать сканирования большого количества строк или сортировки файлов?
Это схема таблицы с текущими показателями я пробовал:
CREATE TABLE `article` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(50) NOT NULL,
`body` text NOT NULL,
`date` int(32) NOT NULL,
`views` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `date` (`date`),
KEY `views` (`views`),
KEY `date_2` (`date`,`views`),
KEY `views_2` (`views`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=200003 ;
--
-- Dumping data for table `article`
--
INSERT INTO `article` VALUES (1, 'title test113', 'test body118', 1317912183, 5017);
INSERT INTO `article` VALUES (2, 'title test193', 'test body193', 1313441124, 5943);
INSERT INTO `article` VALUES (3, 'title test112', 'test body116', 1312773586, 653);
INSERT INTO `article` VALUES (4, 'title test378', 'test body374', 1316786646, 4589);
INSERT INTO `article` VALUES (5, 'title test335', 'test body3310', 1319173694, 6224);
Примечание: Я также попытался дату MySQL вместо Отметка времени Unix, но я получил тот же результат.
Это выход EXPLAIN:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE article range date,date_2 date 4 NULL 107245 Using where; Using filesort
@ я отправил только 5 строк в качестве образца. –
Что такое int (32)? это какой-то подписанный больше int? и в этом отношении, что такое int (11)? http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html –
Это должно быть не 11, а 32. Я уже изменил его на MySQL время и MySQL datetime, и я получил тот же результат. –