2014-02-11 3 views
0

У меня есть следующий запрос, который выполняется в течение очень долгого времени. Таблицы статей article_category и article имеют приблизительно 250 тыс. Строк. Я пробовал несколько индексов с несколькими столбцами, но ничего не ускорил запрос. Текущий EXPLAIN похож на этот (этот текущий индекс состояния состоит из article.status и article.published, и оптимизатор в настоящее время решил использовать его).Предложения GROUP BY и ORDER BY вызывают медленный запрос

Можете ли вы дать мне какой-нибудь совет, какой индекс создать, чтобы ускорить этот запрос?

1 SIMPLE a ref ПЕРВИЧНЫЙ, статус, опубликованный статус 1 const 109338 Использование, где; Использование временных; Использование FileSort

1 SIMPLE переменного тока исх PRIMARY, fk_article_category_category_id_category_id ГЛАВНЫЙ 4 e15.a.id 1 Использование где

1 SIMPLE с eq_ref ОСНОВНОЙ ОСНОВНОЙ 4 e15.ac.category_id 1

SELECT SQL_NO_CACHE `a`.`id`,`a`.`title`,`a`.`perex`,`a`.`published`,`a`.`updated`,`a`.`article_type_id`,`a`.`tag` ,`ac`.`category_id`,`c`.`name`,`a`.`top_hp`,`ac`.`top_category`,`a`.`is_pr`,`a`.`seo_title`,`c`.`id_domain` 
FROM `article` `a` 
JOIN `article_category` `ac` ON `ac`.`article_id` = `a`.`id` 
JOIN `category` `c` ON `ac`.`category_id`=`c`.`id` 
WHERE `ac`.`category_id` IN (109,118,38,39,40,62,63,119,110,111,112,113,114,115,116,117,121,122) 
AND `a`.`status`='published' AND a.published < "2014-02-03 22:45:00" 
GROUP BY `a`.`id` 
ORDER BY `a`.`published` DESC 
LIMIT 0,8 

ответ

0

Вы должны ограничить ваши результаты перед присоединением к ним, например, так (непроверенный!):

SELECT SQL_NO_CACHE `a`.`id`,`a`.`title`,`a`.`perex`,`a`.`published`,`a`.`updated`,`a`.`article_type_id`,`a`.`tag` ,`ac`.`category_id`,`c`.`name`,`a`.`top_hp`,`ac`.`top_category`,`a`.`is_pr`,`a`.`seo_title`,`c`.`id_domain` 
FROM 
(
SELECT `id` FROM `category` WHERE `id` IN (109,118,38,39,40,62,63,119,110,111,112,113,114,115,116,117,121,122) 
) `c` JOIN `article` `a` 
JOIN `article_category` `ac` ON `ac`.`article_id` = `a`.`id` 
JOIN ON `ac`.`category_id`=`c`.`id` 
WHERE `a`.`status`='published' AND a.published < "2014-02-03 22:45:00" 
GROUP BY `a`.`id` 
ORDER BY `a`.`published` DESC 
LIMIT 0,8 
+0

Это выполняет (280 лет) еще хуже (при фиксированной), но спасибо за попытку :-) –

+0

Может быть, вы можете переделать запрос, что «где„а“....» пункт также выполняется перед присоединением – alexbrickwedde

Смежные вопросы