2016-07-19 4 views
0

다음과 같은 쿼리를 사용하여 동일한 테이블 utdat를 두 번 사용하여 데이터를 복구합니다.MyISAM 테이블을 사용하는 MySQL에 대해 동일한 테이블을 두 번 사용하는 쿼리의 속도를 높이려면 어떻게해야합니까?

2 개의 테이블을 연결하는 키는 tableA.utprog = tableB.utprog입니다.

SELECT tableA.upd, tableB.utdata FROM utdat as tableA, utdat AS tableB 
WHERE tableA.uttdat = 'I' AND tableA.utctip = '01' AND 
substring(tableA.utreco, 1, 1) = '3' 
AND tableB.uttdat = 'I' AND tableB.utctip = '01' AND 
substring(tableB.utreco, 1, 1) = '1' 
AND tableA.utprog = tableB.utprog AND TRIM(substr(tableB.utreco, 65, 
12)) = '20000190'; 

MyISAM 데이터베이스에서이 쿼리의 속도를 높이는 방법이 있습니까?

+0

인덱스 사용이 엉망인 함수 호출을 사용하여 검색을 수행합니다. – Drew

답변

2

WHERE 절에서 사용되는 3 열에 대해 다중 열 인덱스 생성 :

ALTER TABLE utdat ADD INDEX (uttdat, utctip, itreco); 

및 SUBSTR` 접두사를 추출한다 SUBSTRING(tableA.utreco, 1, 1) = 3 LIKE expression, but it may not realize thattableA.utreco LIKE '3%', as MySQL knows how to optimize prefix matching in a로 변경.

성능에는 영향을 미치지 않지만 ANSI JOIN 구문도 알아야합니다.

SELECT tableA.upd, tableB.utdata 
FROM utdat as tableA 
JOIN utdat AS tableB ON tableA.utprog = tableB.utprog 
WHERE tableA.uttdat = 'I' AND tableA.utctip = '01' AND tableA.utreco LIKE '3%' 
AND tableB.uttdat = 'I' AND tableB.utctip = '01' AND tableB.utreco LIKE '1%' 
AND TRIM(substr(tableB.utreco, 65, 12)) = '20000190'; 
+0

조언 해 주셔서 감사합니다. 올바르게 작동합니다. – famedoro