2014-02-11 2 views
0

매우 오랫동안 실행되는 다음 쿼리가 있습니다. article_category 및 article 테이블에는 약 250,000 개의 행이 있습니다. 몇 가지 다중 열 인덱스를 시도했지만 쿼리 속도를 높이는 방법은 없습니다. 현재의 EXPLAIN은 다음과 같습니다 (현재 사용되는 상태 색인은 article.status와 article.published로 이루어져 있으며 현재 옵티마이 저는이를 사용하기로 결정했습니다).GROUP BY 및 ORDER BY 절로 인해 쿼리가 느려집니다.

이 쿼리의 속도를 높이기 위해 만들 인덱스에 대한 조언을 해 줄 수 있습니까?

1 단순한 참조 PRIMARY, 상태, 게시 된 상태 1 const 109338 where using; 임시 사용;

1 간단한 C eq_ref PRIMARY PRIMARY 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

당신은 제한해야합니다 어디에 사용 filesort

1 SIMPLE 교류 심판 PRIMARY, fk_article_category_category_id_category_id PRIMARY 4 e15.a.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 
(
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

:-) 시도에 대한,하지만 덕분에 어쩌면 당신은, 쿼리를 재 설계 할 수 있습니다 더 악화은 " 'A'..."조항이 가입 전에도 수행됩니다. – alexbrickwedde