이 쿼리에서 문제가 발생하면 약 213,000 개의 행을 포함하는 중요한 테이블을 검색합니다. 쿼리의 목적은 한 달 동안의 트래픽 데이터를보고하는 것입니다. 해당 월의 각 요일에 대한 트래픽 양. 그리고 매일의 10 진수 값의 합계. 이 쿼리는 자주 실행되므로 최대한 최적화해야합니다. 현재 평균 이초 ..이 간단한 MySQL 쿼리를 빠르게 할 수 있습니까?
SQL 바이올린 : http://sqlfiddle.com/#!2/171f5/3/0
모든 제안이 크게 감사합니다! 고맙습니다.
검색어 :
SELECT `date_day`, COUNT(*) AS num, SUM(decval) AS sum_decval FROM (`tbl_traffic`)
WHERE `uuid` = '1' AND `date_year` = '2012' AND `date_month` = '11'
GROUP BY `date_day`;
설명 결과 :
id: 1
select_type: SIMPLE
table: adb1_analytics
type: ref
possible_keys: keys1,keys2,keys3
key: keys1
key_len: 7
ref: const,const,const
rows: 106693
Extra: Using where
1 row in set (0.13 sec)
테이블 구조 :
CREATE TABLE IF NOT EXISTS `tbl_traffic` (
`id` int(100) unsigned NOT NULL AUTO_INCREMENT,
`uuid` int(100) unsigned NOT NULL,
`country` char(2) CHARACTER SET latin1 DEFAULT NULL,
`browser` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
`platform` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
`referrer` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`decval` decimal(15,5) NOT NULL,
`date_year` smallint(4) unsigned NOT NULL,
`date_month` tinyint(2) unsigned NOT NULL,
`date_day` tinyint(2) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `keys1` (`uuid`,`date_year`,`date_month`,`date_day`),
KEY `keys2` (`date_year`,`date_month`,`referrer`),
KEY `keys3` (`date_year`,`date_month`,`country`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
@ stov01, Michel에 동의합니다. 인덱스의 일부로 decval을 추가하면 인덱스에서 직접 모든 값을 가져올 수 있으며 원시 데이터 행을 필요로하지 않으므로 (uuid, date_year, date_month, date_day, decval)이 최선의 방법입니다. – DRapp
count (id)는 차이가 없었지만 전체 색인은 트릭을 만들었습니다. 이전에 시도했지만 작동하지 않았습니다. 다시 시도했지만 작동하지 않았습니다.하지만 ANALYZE TABLE을 수행 한 후에 트릭을 수행 한 것처럼 보였습니다! 이제 평균 2 초에서 0.4 초로 줄었습니다. 고마워요! – stov01