2011-02-03 3 views
19

특정 기준을 충족하는 데이터를 강조 표시 할 표의보기를 만들려고합니다. 예를 들어 정수 값이있는 테이블이있는 경우 뷰에 100보다 큰 값이있는 행을 표시하고 싶습니다. 테이블에서 뷰를 생성하여이를 수행하는 방법을 알고 있지만 뷰는 동적입니까? 나는 이것을 MySQL에서 테스트했으며 사실 인 것처럼 보인다. 하지만 내 테이블에 1000 행 이상이있는 경우 이것이 효율적입니까? 뷰가 원본 테이블의 변경 사항에 대해 "동적으로"업데이트됩니까?MySql 뷰가 동적이고 효율적입니까?

+0

http://stackoverflow.com/q/7922675/632951 – Pacerier

답변

23

기본적으로 기본적으로 MySQL에는 2 types of views이 있습니다.

  1. 병합 조회수

    기본적으로 그냥보기 이러한 유형의 뷰의 SQL로 쿼리를 다시는-기록합니다. 따라서 검색어를 직접 작성하는 것은 간단합니다. 실제 성능상의 이점은 없지만 복잡한 조회를 더 쉽게 작성하고 유지 보수를 더 쉽게 만들 수 있습니다 (보기 정의가 변경되면보기에 대해 하나의 정의 만 100 개의 조회를 변경할 필요가 없으므로).

  2. TEMPTABLE 조회수

    보기이 유형의 뷰의 SQL에서 쿼리와 임시 테이블을 생성합니다. 병합보기의 모든 이점을 갖지만 뷰의 테이블에 대한 잠금 시간도 줄어 듭니다. 따라서로드가 많은 서버에서는 성능이 상당히 향상 될 수 있습니다.

그러나주의하는 것이 중요한 일에주의한다는 것입니다 ... 또한의 MySQL의는 질의 시간에 최선의 유형이 어떻게 생각하는지 선택하자 "정의되지 않은"보기 유형 (기본값),있다 MySQL에는 materialized views에 대한 지원이 없습니다. 따라서 복잡한 뷰를 통해 쿼리 성능을 크게 높여주는 Oracle과는 다릅니다. 뷰의 쿼리는 항상 MySQL에서 실행됩니다.

효율면에서 MySQL의 뷰는 효율성을 높이거나 낮추지 않습니다. 쿼리를 작성하고 유지 관리 할 때 더 쉽게 사용할 수 있습니다. 나는 수억 개의 행을 가진 테이블에 뷰를 사용했고, 그들은 잘 작동했다 ...

+0

을 참조하십시오. 감사합니다 ircmaxell! – Santiago

+1

뷰를 사용하면 성능에 영향을 미칩니다. MySQL이 중첩 쿼리에 잘 대처하지 못하기 때문에 쿼리를 푸시하기위한 기능이 매우 제한적입니다. OTOH SELECT 중첩을 사용하지 않고 쿼리를 최적화 할 수 있습니다. – symcbean

+0

@symcbean : 그 주장을 뒷받침 할만한 언급이 있습니까? 나는 그것을 (정당하게 이렇게)보기 위하여 흥미 롭다 ... – ircmaxell

9

mysql은 임시 테이블에서 인덱스를 사용하지 않으므로 성능에 심각한 영향을 미칠 수있다.

관련 문제