2017-03-06 2 views
0

에서 쿼리와 테이블을 최적화 나는이 가끔 이상 30 초 걸릴 수 1100 만 개 레코드가있는 테이블의 경우 다음 쿼리/테이블는 MySQL의 5.1

SELECT playitemid,MAX(playdatetime) 
     FROM buma 
     WHERE licenseid = 1 AND playdatetime > Date_sub(Curdate(), INTERVAL 1 month) 
     GROUP BY playitemid 

을 최적화에 관한 질문이 있습니다.

다음은 테이블에 대한 create 문입니다.

CREATE TABLE `buma` (
`bumaid` int(11) NOT NULL AUTO_INCREMENT, 
`playitemid` int(11) NOT NULL, 
`playdatetime` datetime DEFAULT NULL, 
`stopdatetime` datetime DEFAULT NULL, `licenseid` int(11) NOT NULL, editionid` int(11) DEFAULT NULL, 
PRIMARY KEY (`bumaid`), 
KEY `ind_buma`(`playdatetime`,`licenseid`,`playitemid`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=68644363 DEFAULT CHARSET=latin1; 

쿼리를

종류 안부 속도를 더 키 또는 인덱스를 정의 할 수있는 방법이 있나요,

비요른

+0

당신이'EXPLAIN' 쿼리를 시도한 곳 (이 경우 KEY를 사용해야하는 것처럼 보였지만 확실하지는 않지만) –

+0

나는 (당신이 제공 한 것을 기준으로 생각하면) 인덱스 만 '(playdatetime, licenseid)'가 더 잘 수행됩니다. –

+0

@AlonEitan이 SIMPLE \t buma \t 범위 \t ind_buma \t ind_buma \t 5,564,864 \t 어디에 사용 전에 내가 설명하는 주석을 실행하면, 색인 사용; 임시 사용; Using filesort – Subblaze91

답변

0

playitemid 만, 만 playdatetime 인덱스에 licenseid을 시도하거나 그룹 licenseid, playitemid.

MySQL 5.1은 매우 오래된 버전입니다 (10 세). 좋은 성능 향상을 위해 5.7로 업그레이드하십시오 (또는 mariadb 10.1과 같은 mysql 포크를 사용하십시오).

mysql (php strtotime 또는 기타)없이 Date_sub (Curdate(), INTERVAL 1 개월)을 계산하고, 하루에 두 번 이상 호출하는 경우 mysql cache를 사용하여 즉시 요청할 수도 있습니다. 128MB 이상을 사용하지 마십시오. 성능이 저하 될 수 있습니다).