2013-04-23 2 views
1

MySQL 성능에 대한 질문이 있습니다.MySQL 최적화 카운트 쿼리

SELECT SQL_NO_CACHE COUNT(id) as total 
FROM (`article`) 
LEFT JOIN `article_category` ON `article_category`.`article_id` = `article`.`id` 
WHERE `article`.`language_id` = 1 
AND `article_category`.`category_id` = '<catid>' 

이 쿼리가 소요 :이 수의 쿼리를 실행

(약 140.000 기록)

CREATE TABLE IF NOT EXISTS `article` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `label` varchar(256) COLLATE utf8_unicode_ci NOT NULL, 
    `title` varchar(256) COLLATE utf8_unicode_ci NOT NULL, 
    `intro` text COLLATE utf8_unicode_ci NOT NULL, 
    `content` text COLLATE utf8_unicode_ci NOT NULL, 
    `date` int(11) NOT NULL, 
    `active` int(1) NOT NULL, 
    `language_id` int(11) NOT NULL, 
    `category_id` int(11) NOT NULL, 
    `indexed` int(1) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=132911 ; 

(약 400.000 기록)

CREATE TABLE IF NOT EXISTS `article_category` (
    `article_id` int(11) NOT NULL, 
    `category_id` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

: 이 내 테이블입니다 많은 리소스가 있으므로이 쿼리를 최적화하는 방법을 궁금합니다. 실행 후 beeing 캐시 된, 그래서 첫 번째 실행 후 나는 괜찮아.

(가) 기능을 EXPLAIN RUNNING :

enter image description here

인덱스를 생성 한 후 : 인덱스를 추가하고 LEFT를 변경 한 후

ALTER TABLE `article_category` ADD INDEX (`article_id` , `category_id`) ; 

enter image description here

쿼리를 가입하는 가입은 많이 빠르게 실행! 이러한 빠른 replys : 대한 덕분에 나는 지금 USE

QUERY (이것은 그 neccesary 없었기 때문에 나는 LANGUAGE_ID를 제거) :

SELECT COUNT(id) as total 
FROM (`article`) 
JOIN `article_category` ON `article_category`.`article_id` = `article`.`id` 
AND `article_category`.`category_id` = '<catid>' 

내가 인덱스를 강제 대해 뭔가를 읽었습니다,하지만 난 그게 생각 테이블이 이미 인덱싱되었으므로 더 이상 필요하지 않습니다.

고마워요! 색인 article_id 필요하므로, 인덱스를해야 가입 조건에 사용

마티

+0

EXPLAIN의 결과보기

+0

'article_category.article_id'에 색인을 추가하십시오. – Barmar

+1

'LEFT JOIN'을해서는 안되며'ON' 절에서'category_id = '을 테스트해야합니다. 그렇지 않으면'article_categories'에서 일치하지 않는 기사를 필터링합니다. – Barmar

답변

2
당신은 테이블에 필요한 인덱스를 작성하지 않은

article_category - (article_id, category_id)

article에 복합 인덱스를 생성하는 (id, language_id)

에 복합 인덱스가이 방법으로 문제가 해결되지 않으면 -Create Explain 문을 게시하십시오.