2012-11-14 2 views
1

이 쿼리에서 문제가 발생하면 약 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; 

답변

0

count (id)를 사용하고 date_day 및 decval에 키를 추가하십시오. 두 필드를 통해 커버링 키 성능에 영향 INT (100)보다는 BIGINT를 사용하여 내 교화를 들어

+1

@ stov01, Michel에 동의합니다. 인덱스의 일부로 decval을 추가하면 인덱스에서 직접 모든 값을 가져올 수 있으며 원시 데이터 행을 필요로하지 않으므로 (uuid, date_year, date_month, date_day, decval)이 최선의 방법입니다. – DRapp

+0

count (id)는 차이가 없었지만 전체 색인은 트릭을 만들었습니다. 이전에 시도했지만 작동하지 않았습니다. 다시 시도했지만 작동하지 않았습니다.하지만 ANALYZE TABLE을 수행 한 후에 트릭을 수행 한 것처럼 보였습니다! 이제 평균 2 초에서 0.4 초로 줄었습니다. 고마워요! – stov01

1

당신은 더 effectiv이 없습니다 전자 지수는 date_day입니다.

내가 특별히 당신이 가져 와서 계산 무엇에 대한 키를 생성하는 것이 좋습니다 : (date_day, decval)

+0

을 더 잘 될 수 있을까요? –

+0

@rontornambe [초기 연구] (http://planet.mysql.com/entry/?id=13825)는 'bigint'에 비해 약간의 성능이 있음을 보여줍니다. – Kermit

+0

감사합니다. 그냥 시도했지만 차이는 없습니다 ... – stov01

0

언제 당신이 전체 테이블 스캔을 요구하고 '그룹화'는 해.

http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

색인 더 나은 (@njk 대답을 참조) 한 다음 특정 값을 선택하는 것이 좋습니다 수없는 경우 다음 서브 세트에 그룹, 합계 등을한다. 그 밖의 것이 없다면 적어도 정렬 할 작은 세트가 될 것입니다.

+0

내 초기 반응은 파생 된 테이블이 도움이되지 않는다는 것입니다. – Kermit

+0

아마도 그렇지 않습니다. 이를 해결하기 위해서는 몇 가지 실험이 필요합니다. – ethrbunny

관련 문제