• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 1. Stored Program 제한
    2. 조건 처리 제한
    3. 서버 측 커서 제한
    4. 서브 쿼리 제약
    5. View 제약
    6. XA 트랜잭션 제약
    7. Character Set 제약
    8. 성능 스키마 제약
    9. 플러그 인증 제한
    10. MySQL 제한
  • 28. MySQL 5.7 새로운 기능

27.5 View 제약

뷰의 처리는 최적화되어 있지 않습니다.

  • 뷰에 인덱스를 만들 수 없습니다.

  • 병합 알고리즘을 사용하여 처리 된 뷰에 인덱스를 사용하는 것은 가능합니다. 그러나 TEMPTABLE 알고리즘으로 처리 된 뷰는 그 기반이되는 테이블의 인덱스를 사용할 수 없습니다 (그러나 임시 테​​이블을 만드는 동안 인덱스를 사용할 수 있습니다).

뷰의 FROM 절에서 서브 쿼리는 사용할 수 없습니다.

일반적인 원칙은 테이블을 변경할 수도 하위 쿼리 같은 테이블에서 선택 할 수 없습니다. 섹션 27.4 "서브 쿼리 제한" 을 참조하십시오.

테이블에서 선택하는 뷰를 선택하면 뷰가 서브 쿼리의 테이블에서 선택되거나 뷰가 병합 알고리즘을 사용하여 평가하는 경우에도 동일한 원칙이 적용됩니다. 예 :

 CREATE VIEW v1 AS
 SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a);

 UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;

임시 테이블을 사용하여 뷰가 평가되는 경우, 뷰 서브 쿼리의 테이블에서 선택하고, 외부 쿼리에서 테이블을 변경할 수 있습니다. 이 경우 뷰는 임시 테이블에 저장되기 때문에 실제로는 뷰를 서브 쿼리의 테이블에서 선택하고 "동시에"변경하는 것이 아닙니다. (이것은 뷰 정의에서 ALGORITHM = TEMPTABLE 을 지정하여 MySQL에서 TEMPTABLE 알고리즘을 강제로 사용하는 하나의 이유입니다.)

DROP TABLE 또는 ALTER TABLE 을 사용하면 뷰 정의에서 사용되는 테이블을 삭제 또는 변경할 수 있습니다. 뷰를 비활성화하는 경우에도 DROP 또는 ALTER 조작에 의해 경고가 나오는 것은 아닙니다. 대신 나중에 뷰를 사용할 때 오류가 발생합니다. CHECK TABLE 은 DROP 또는 ALTER 조작으로 비활성화 된 뷰의 체크에 사용할 수 있습니다.

MySQL 5.6.5 이전에는 뷰 정의는 특정 문에서 "고정"됩니다. PREPARE 에서 준비된 문이 뷰를 참조하는 경우 나중에 문이 수행 될 때마다 확인되는 뷰 정의는 준비된 시점의 뷰 정의됩니다. 이것은 문이 준비된 후 실행되기 전에 뷰 정의가 변경 되더라도 같은 것입니다. 다음의 예에서 EXECUTE 문에서 반환 된 결과는 현재의 날짜와 시간이 아니라 임의의 수치입니다.

 CREATE VIEW v AS SELECT RAND ();
 PREPARE s FROM 'SELECT * FROM v';
 ALTER VIEW v AS SELECT NOW ();
 EXECUTE s;

뷰의 갱신 가능성에 관해서는 어떤 뷰에서도 이론적으로 업데이트 가능하면 실제로 업데이트 할 필요가 있다는 것이 뷰의 전반적인 목적입니다. 여기에는 정의에 UNION 이 적혀있는 뷰도 포함되어 있습니다. 현재, 이론적으로 갱신 가능한 모든보기가 실제로 업데이트 가능한 것은 아닙니다. 첫 번째 뷰 구현은 사용 가능한 업데이트 가능한 뷰를 가능한 한 신속하게 MySQL을 제공하기 위해 의도적으로 이렇게 적혀있었습니다. 현재 이론적으로 갱신 가능한 뷰의 많은 업데이트 할 수 있지만 제한은 여전히​​ 존재합니다.

  • WHERE 절 이외의 장소에 서브 쿼리가있는 갱신 가능한 뷰. SELECT 목록에 서브 쿼리가있는 뷰에 업데이트 가능한 경우가 있습니다.

  • UPDATE 를 사용하여 결합으로 정의 된 뷰의 여러 기반이되는 테이블은 업데이트 할 수 없습니다.

  • DELETE 를 사용하여 결합으로 정의 된 뷰는 업데이트 할 수 없습니다.

뷰의 현재 구현에는 단점이 있습니다. 뷰 생성에 필요한 기본 권한 ( CREATE VIEW 권한과 SELECT 권한)이 부여되어 있어도 SHOW VIEW 권한도 부여되지 않은 경우 개체 SHOW CREATE VIEW 를 호출 할 수 없습니다.

권한의 부족으로 인해 mysqldump가 실패 할 가능성이 있다는 단점하여이 명령을 사용하여 데이터베이스 백업에 문제가 발생할 수 있습니다. 이 문제에 대해서는 Bug # 22062로 설명하고 있습니다.

문제의 해결 방법은 뷰가 작성된 경우 MySQL이 암묵적으로 SHOW VIEW 권한을 미치지 않으므로 CREATE VIEW 를 인정하는 사용자에게 관리자가 수동으로 권한을 부여합니다.

뷰에 인덱스가 없기 때문에 인덱스 팁은 적용되지 않습니다. 뷰에서 선택시 인덱스 힌트의 사용은 허용되지 않습니다.

SHOW CREATE VIEW 는 컬럼마다 AS alias_name 절을 사용하여 뷰 정의를 표시합니다. 수식에서 컬럼을 만들 때 기본 별칭은 식 텍스트가 상당히 길어질 수 있습니다. CREATE VIEW 문에서 컬럼 이름에 대한 별칭 (256 문자의 최대의 별칭 길이가 아니라) 64 문자의 최대 컬럼 길이에 대해 검사됩니다. 그 결과 하나의 컬럼 별칭이 64자를 초과하면 SHOW CREATE VIEW 출력에서 생성 된 뷰는 실패합니다. 따라서 너무 별칭을 가진 뷰에 대해 다음 환경에서 문제가 발생할 수 있습니다.

  • 뷰 정의는 컬럼 길이의 제약을 강제하는 새로운 슬레이브에 복제 할 수 없습니다.

  • mysqldump로 생성 된 덤프 파일은 컬럼 길이의 제약을 강제하는 서버에로드 할 수 없습니다.

이 문제를 해결하려면 짧은 컬럼 이름을 제공하는 별칭을 사용하도록 문제가있는 각 뷰 정의를 변경합니다. 이 경우 뷰는 제대로 복제 오류를 생성하지 덤프 및 리로드 수 있습니다. 정의를 변경하려면 DROP VIEW 및 CREATE VIEW 뷰를 삭제하고 다시 만들거나 CREATE OR REPLACE VIEW 를 사용하여 정의를 대체합니다.

덤프 파일보기 정의 리로드시 문제가 발생하는 경우 CREATE VIEW 문을 변경하도록 덤프 파일을 편집하면이 문제를 해결할 수 있습니다. 그러나 이것은 원래 뷰 정의를 변경하지 않기 때문에 다음 덤프 동작의 문제를 일으킬 수 있습니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved