2011-10-27 2 views
1

У меня есть следующий запрос, чтобы получить наиболее просматриваемые статьи, представленные в прошлом месяце, например.Оптимизировать порядок 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 
+0

@ я отправил только 5 строк в качестве образца. –

+0

Что такое int (32)? это какой-то подписанный больше int? и в этом отношении, что такое int (11)? http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html –

+0

Это должно быть не 11, а 32. Я уже изменил его на MySQL время и MySQL datetime, и я получил тот же результат. –

ответ

1

Один ключ date_2 (date, views) должно дать оптимальную производительность для запроса о котором идет речь. См. here Я не думаю, что другие индексы помогут. Поскольку запрос такой простой, я не могу придумать никакой другой оптимизации!

+0

Нет, user_ksa верен. Можно использовать индекс '(date)' или '(views)'. –

1

Для таких запросов можно использовать только (date) или (views), а не состав (date,views). То, что MySQL хочет использовать, может быть или не быть оптимальным. И то, что оптимально для февраля, может быть не для данных апреля!

  • Вы можете попробовать форсировать один из двух и измерить предварительную готовность.

  • Вы можете добавить вычисляемый столбец с Year-Month данных, используя CHAR(6) как 201104 за апрель 2011 года (этот столбец можно обновить с помощью INSERT и UPDATE триггеров) или int как 24136 (24136 = 2011 * 12 + 4).

Тогда ваше состояние будет:

WHERE YearMonth = '201109'   --- for September 

или

WHERE YearMonth = 2011*12+9  

и индекс (YearMonth, views) может быть использован.

1

Принудительный указатель достигается.

explain 
SELECT * 
FROM article force index (`views`) 
WHERE date>=1315391768 
ORDER BY views DESC 
LIMIT 10 

Объяснить план:

"id" "select_type" "table"  "type"  "possible_keys" "key" "key_len"  "ref" "rows" "Extra" 
"1" "SIMPLE"  "article" "index"   \N   "views" "4"   \N "5" "Using where" 
Смежные вопросы