MySQL은 뷰는 두 개의 서로 다른 알고리즘 중 하나를 사용하여 처리됩니다 MERGE
나 TEMPTABLE
. MERGE
적절한 별칭이있는 검색어 확장입니다. TEMPTABLE
WHERE 절을 실행하기 전에 뷰가 결과를 임시 테이블에 넣고 인덱스가없는 것처럼 보입니다.
'third'옵션은입니다 UNDEFINED
. 이것은 MySQL에게 적절한 알고리즘을 선택하도록 지시합니다. MySQL MERGE
은 더 효율적이기 때문에 사용하려고 시도합니다 . 주요주의 사항 :
MERGE 알고리즘을 사용할 수없는 경우 임시 테이블을 대신 사용해야합니다. 뷰에 다음 구문이 포함되어 있으면 MERGE를 사용할 수 없습니다.
집계 함수 (SUM (), MIN (), MAX (), COUNT () 등)
뚜렷한
GROUP BY
HAVING
한도
UNION 또는 UNION ALL
선택 목록의 하위 쿼리
리터럴 값만 참조합니다 (이 경우 기본 테이블이 없음).
[src]
귀하의 VIEWS가 TEMPTABLE 알고리즘을 요구하여 성능 문제를 일으키는 것으로 추측합니다.
다음은 MySQL의 뷰 성능에 대한 오래된 블로그 게시물 이며 더 좋아 보이지는 않습니다.
그러나 인덱스를 포함하지 않는 임시 테이블 (전체 테이블 스캔을 야기 함)의이 문제에 대해서는 터널 끝에서 약간의 빛이있을 수 있습니다. 에서 5.6 :
FROM 절의 서브 쿼리에 구체화가 필요한 경우 옵티마이 저는 구체화 된 테이블에 인덱스를 추가하여 결과에 대한 액세스 속도를 높일 수 있습니다. ... 인덱스를 추가 한 후 옵티마이 저는 구체화 된 파생 테이블을 인덱스가있는 일반 테이블과 동일하게 처리 할 수 있으며 생성 된 인덱스의 이점과 유사합니다. 인덱스가없는 쿼리 실행 비용과 비교하여 인덱스 생성 오버 헤드는 무시할 수 있습니다.
@ypercube가 지적한 것처럼 MariaDB 5.3도 동일한 최적화를 추가했습니다. 이 기사 에는 프로세스에 대한 흥미로운 개요가 있습니다.
최적화가 적용된 다음 파생 테이블을 상위 SELECT에 병합 할 수 없습니다. 파생 테이블이 병합 가능한 VIEW에 대한 기준을 충족하지 않을 때 발생합니다.