2012-12-05 4 views
4

이 쿼리의 실행 시간은 2 초 이상입니다 (10k 행). 이 쿼리를 최적화 할 수 있습니까?MySQL에서 BETWEEN이 긴 실행 시간

SELECT id, MIN(ABS(timestamp_a - timestamp_b)) 
FROM a 
    INNER JOIN b ON (timestamp_a between (timestamp_b - 5 * 60) 
       AND (timestmap_b + 5 * 60)) 
GROUP BY id 

샘플 결과 (ID, timestamp_a, timestamp_b, DIFF)

1 1349878538 1349878539 1 
2 1349878679 1349878539 2 
3 1349878724 1349878539 1 
5 1349878836 1349878539 1 
6 1349878890 1349878641 1 

표 A

CREATE TABLE `a` (
`id` int(11) NOT NULL AUTO_INCREMENT , 
`timestamp_a` bigint(20) NULL DEFAULT NULL , 
PRIMARY KEY (`id`), 
INDEX `a` (`timestamp_a`) USING BTREE 
) 

CREATE TABLE `b` (
`id` int(11) NOT NULL AUTO_INCREMENT , 
`timestamp_b` bigint(20) NULL DEFAULT NULL , 
PRIMARY KEY (`id`), 
INDEX `b` (`timestamp_b`) USING BTREE 
) 

B 두 테이블 간의 관계없는 - 'a'테이블에서 레코드를 검색합니다. 테이블 'b'의 타임 스탬프 사이.

편집 : 가장 단순한 솔루션 (매우 빠른 실행) :

SELECT id, MIN(ABS(timestamp_a - timestamp_b)) 
FROM (SELECT id, timestamp, (timestamp - 5 * 60) timestamp_a, (timestamp + 5 * 60) timestamp_b) a 
INNER JOIN b ON (timestamp between timestamp_a AND timestamp_b) 
GROUP BY id 
+0

테이블 구조를 더 잘 설명 할 수 있습니까? 당신의 질문에 두 테이블 모두에 대해 'SHOW CREATE TABLE' 결과를 포함 할 수 있습니다. 테이블은 어떻게 서로 관련이 있습니까? 주요 문제는 매우 복잡한 JOIN 조건이지만이 정보가 없으면 대안을 추천하기가 어렵다고 생각합니다. –

+0

당신의 대답을위한 thx - 지금 제 질문을 참조하십시오. – ekstro

+0

이 쿼리는 크게 도움이되지 않지만 타임 스탬프 열을'TIMESTAMP' 또는'INT UNSIGNED NOT NULL'으로 설정해야합니다. 'BIGINT'는 잘못된 유형입니다. ID 열은 'UNSIGNED'여야합니다. –

답변

0

수정 된 타임 스탬프 열 마이클의 규칙을 고려하여 "빠른 성능과 원래 쿼리의 의도 된 결과를 얻을이 쿼리 "쿼리 위 :

SELECT a.id, MIN(ABS(a.timestamp_a - tmp_b.timestamp_b)) 
FROM (SELECT id, timestamp_b, (timestamp_b - 5 * 60) timestamp_b_minus, (timestamp_b + 5 * 60) timestamp_b_plus) tmp_b 
INNER JOIN a ON (a.timestamp_a between tmp_b.timestamp_b_minus AND tmp_b.timestamp_b_plus) 
GROUP BY a.id 

원래 쿼리 경험 성능 제약을 RDBMS가 b의 전체 테이블 스캔을 수행하도록 강제하는 것이된다하는 이유 ON 절에 사용 된 수식 때문에 a의 모든 행 tmp_b 다음 "빨리"쿼리는 기준에 따라 a에서 적절한 값을 추출 a.timestamp_a에 인덱스를 사용할 수있는 "일시적으로"테이블 tmp_b를 생성하는 b의 전체 테이블 스캔을 요구에도 불구하고

. timestamp_b_minus AND tmp_b.timestamp_b_plus