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 :
인덱스를 생성 한 후 : 인덱스를 추가하고 LEFT를 변경 한 후
ALTER TABLE `article_category` ADD INDEX (`article_id` , `category_id`) ;
쿼리를 가입하는 가입은 많이 빠르게 실행! 이러한 빠른 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
필요하므로, 인덱스를해야 가입 조건에 사용
마티
EXPLAIN의 결과보기 –
'article_category.article_id'에 색인을 추가하십시오. – Barmar
'LEFT JOIN'을해서는 안되며'ON' 절에서'category_id ='을 테스트해야합니다. 그렇지 않으면'article_categories'에서 일치하지 않는 기사를 필터링합니다. –
Barmar