MySQL은 뷰는 두 개의 서로 다른 알고리즘 중 하나를 사용하여 처리됩니다 MERGE나 TEMPTABLE. MERGE적절한 별칭이있는 검색어 확장입니다. TEMPTABLEWHERE 절을 실행하기 전에 뷰가 결과를 임시 테이블에 넣고 인덱스가없는 것처럼 보입니다.
'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에 대한 기준을 충족하지 않을 때 발생합니다.