MySQL에서 실행하는 데 약 15-20 초가 걸리는 쿼리를 최적화하려고했습니다. 내 데이터 테이블에는 약 10 백만 개의 행이 있으며 쿼리는 144 개의 "실행"필드와 35 개의 "이름"필드와 일치하는 68,000 개의 레코드를 반환하려고합니다. 쿼리는 두 개의 절을 사용하기 때문에 내 인덱스는별로 도움이되지 않습니다.2 개의 "in"절을 사용하여 쿼리 최적화
select * from data d where
d.data_type='Result' and
(d.run in ('8a7aee1f2a6232b1012a624da9201b92', '8a7aee1f2a6232b1012a625432a314ef' ,
... [144 runs]
)) and (d.name like 'itema[%]' or d.name like 'itemb[%]')
여기
CREATE TABLE `data` (
`data_type` varchar(31) NOT NULL,
`id` char(32) NOT NULL,
`entry_time` datetime default NULL,
`name` varchar(255) NOT NULL,
`step` int(11) default NULL,
`value` double NOT NULL,
`run` char(32) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK2EEFAA8ECCC6F3` (`run`),
KEY `data2` (`run`,`step`),
KEY `data3` (`data_type`,`name(10)`,`run`),
CONSTRAINT `FK2EEFAA8ECCC6F3` FOREIGN KEY (`run`) REFERENCES `run_archive` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
키 데이터 3를 사용하는 나에게 질의를 알려줍니다 설명 테이블 정의를 다음과 같습니다
다음은 쿼리입니다.
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE d range FK2EEFAA8ECCC6F3,data2,data3 data3 223 NULL 113271 Using where
144 개의 쿼리 (각 실행마다 하나씩)를 실행하는 데 사용되었습니다. 하나의 쿼리를 수행하는 데 약 두 배나 빠르지 만 여전히 느립니다.
최적화를위한 제안? 내가 가진 아이디어는 다음과 같습니다
은 (는 실행 제거하기 쉬운,하지만 이름에 대한
열심히 것
이 최대비정규 데이터 속도 마법의 인덱스를 찾기)
분할 최대 다른 테이블 간의 데이터 (내 자바/최대 절전 모드 접근 할 하드)
아니면 여기서는 불가능한 질문을하고 있습니까?
편집 : 가장 큰 문제는 innodb_buffer_pool의 크기를 늘리는 것이 었습니다. 이 작업을 수행 한 후 약 1 초 30 초로 쿼리가 다운되었습니다. 필자는 "대답"으로 약간 개선 된 수정으로 표시했습니다.
where 절의 개별 제한 사항의 선택도는 무엇입니까? 즉 '결과'데이터 유형을 가진 행 수, 일치하는 실행이있는 행 수 및 일치하는 이름을 가진 행의 수는 테이블에 있습니까? – meriton
편집 : data3 키가 잘못되었습니다. (나는 handedit). 첫 번째 필드는 data_type입니다. –