15.7.2 MERGE 테이블의 문제점
MERGE
테이블의 알려진 문제점은 다음과 같습니다.
5.1.23 버전 이전의 MySQL Server에서는 MyISAM의 비 일시적인 아이의 테이블을 가진 임시 병합 테이블을 만들 수있었습니다.
버전 5.1.23에서는 MERGE 아이는 부모의 테이블을 통해 잠금되었습니다. 부모가 일시적이면 부모가 잠겨 않았기 때문에 아이도 잠겨 없습니다. MyISAM 테이블을 동시에 사용하면 테이블이 손상되었습니다.
ALTER TABLE
을 사용하여MERGE
테이블을 다른 스토리지 엔진으로 개조하면 기본 테이블에 매핑이 손실됩니다. 대신 변경된 테이블에 기초MyISAM
테이블의 행이 복사되고 그 때 지정된 스토리지 엔진을 사용합니다.MERGE
테이블INSERT_METHOD
테이블 옵션은MERGE
테이블에 삽입에 어떤 기초MyISAM
테이블을 사용하는 방법을 보여줍니다. 그러나 그MyISAM
테이블에AUTO_INCREMENT
테이블 옵션을 사용하여 하나 이상의 행이MyISAM
테이블에 직접 삽입 될 때까지MERGE
테이블에 삽입은 적용되지 않습니다.MERGE
테이블은 테이블 전체 UNIQUE 제약 조건을 유지할 수 없습니다.INSERT
를 실행하면 데이터는 첫 번째 또는 마지막MyISAM
테이블 (INSERT_METHOD
옵션에서 지정됩니다)에 들어갑니다. MySQL은 고유의 키 값이MyISAM
테이블 내에서 고유 한 남아 있는지를 보장하지만 컬렉션의 모든 기초 테이블에 대해서는 보증하지 않습니다.MERGE
엔진은 기본 테이블 세트에 고유성을 적용 할 수 없기 때문에REPLACE
는 예상대로 작동하지 않습니다. 다음의 두 가지 중요한 사실이 있습니다.REPLACE
는 쓰려고하는 기초 테이블에서만 고유 키 위반을 검색 할 수 있습니다 (INSERT_METHOD
옵션에서 지정됩니다). 이것은MERGE
테이블 자체의 위반과는 다릅니다.REPLACE
이 고유 키 위반을 발견했을 경우, 쓰는 기초 테이블의 해당 행만을 변경합니다. 즉INSERT_METHOD
옵션에 지정된 첫 번째 또는 마지막 테이블입니다.
INSERT ... ON DUPLICATE KEY UPDATE
에 대해서도 고려가 적용됩니다.MERGE
테이블은 파티셔닝을 지원하지 않습니다. 즉,MERGE
테이블도MERGE
테이블의 기초MyISAM
테이블도 분할 할 수 없습니다.열린
MERGE
테이블에 매핑 된 어떤 테이블도ANALYZE TABLE
,REPAIR TABLE
,OPTIMIZE TABLE
,ALTER TABLE
,DROP TABLE
,DELETE
(WHERE
절없이) 또는TRUNCATE TABLE
을 사용해서는 없습니다. 이렇게하면MERGE
테이블은 여전히 원래의 테이블을 참조하고 있기 때문에 예기치 않은 결과가 될 가능성이 있습니다. 이 문제를 해결하려면 명명 된 작업을 수행하기 전에FLUSH TABLES
명령문을 발행하여 확실하게MERGE
테이블이 열려되지 않도록합니다.예기치 않은 결과는
MERGE
테이블에 대한 작업을 통해 테이블의 손상이보고 될 가능성이 있습니다. 기초MyISAM
테이블에서 명명 된 조작의 후에이 발생한 경우 손상된 메시지는 거짓입니다. 이를 해결하려면MyISAM
테이블을 변경 한 후에FLUSH TABLES
문을 실행합니다.MERGE
스토리지 엔진의 테이블 매핑은 MySQL의 상위 레이어에서 숨어 있기 때문에,MERGE
테이블에 의해 사용되는 테이블에서DROP TABLE
은 Windows에서 작동하지 않습니다. Windows에서는 열려있는 파일의 삭제를 허용하지 않기 때문에 먼저 모든MERGE
테이블을 플러시하거나 (FLUSH TABLES
를 사용합니다) 테이블을 삭제하기 전에MERGE
테이블을 삭제해야합니다.MyISAM
테이블과MERGE
테이블 정의는 테이블에 액세스 할 때 체크됩니다 (예를 들어,SELECT
또는INSERT
문의 일부로). 이 검사는 테이블 정의와 부모의MERGE
테이블의 정의가 컬럼 순서, 유형, 크기 및 관련 인덱스를 비교하여 일치하는 것을 보증합니다. 테이블간에 차이가있는 경우 오류가 리턴 명령문이 실패합니다. 테이블이 열릴 때 이러한 검사가 이루어지기 때문에 하나의 테이블의 정의를 변경하면 (컬럼의 변경, 컬럼의 순서 엔진의 변경 등) 명령문이 실패하는 원인이됩니다.MERGE
테이블과 기본 테이블의 인덱스 순서는 동일해야 안됩니다.ALTER TABLE
을 사용하여MERGE
테이블 내에서 사용되는 테이블에UNIQUE
인덱스를 추가 한 다음ALTER TABLE
을 사용하여MERGE
테이블에 고유하지 않은 인덱스를 추가하면 기본 테이블에 고유하지 않은 인덱스가 이미 존재하고 그 테이블의 인덱스 순서는 다릅니다. (이것이 발생하는 중복 키를 빠르게 찾을 수 있도록ALTER TABLE
이 고유하지 않은 인덱스 앞에UNIQUE
인덱스를 배치하는 것입니다.) 그 결과, 이러한 인덱스를 가진 테이블에 대한 쿼리는 의외의 결과 를 가져올 수 있습니다.ERROR 1017 (HY000) : Can not find file : '
tbl_name
.MRG '(errno : 2) 오류 메시지가 표시되는 경우 일반적으로 몇 가지 기본 테이블이MyISAM
스토리지 엔진을 사용하지 않는 것을 나타냅니다. 이러한 테이블이MyISAM
임을 확인하십시오.MERGE
테이블 행의 최대 값은 2 64입니다 (~ 1.844E + 19에서MyISAM
테이블의 경우와 같다). 여러MyISAM
테이블을이 수보다 많은 행을 포함하는 단일MERGE
테이블에 병합 할 수 없습니다.MERGE
스토리지 엔진은INSERT DELAYED
명령문을 지원하지 않습니다.부모의
MERGE
테이블을 가진 다른 행 형식의 기초MyISAM
테이블을 사용하면 현재 실패하는 것으로 알려져 있습니다. 버그 # 32364를 참조하십시오.LOCK TABLES
이 실시되는 경우, 비 일시적인MERGE
테이블 조인 목록을 변경할 수 없습니다. 다음은 작동하지 않습니다.CREATE TABLE m1 ... ENGINE = MRG_MYISAM ...; LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE; ALTER TABLE m1 ... UNION = (t1, t2) ...;
그러나 임시
MERGE
테이블에서는 이렇게 할 수 있습니다.임시
MERGE
해도 비 일시적인MERGE
테이블로도CREATE ... SELECT
에서MERGE
테이블을 만들 수 없습니다. 예 :CREATE TABLE m1 ... ENGINE = MRG_MYISAM ... SELECT ...;
이를 시도하면
tbl_name
은BASE TABLE
이 아니라는 오류입니다.있는 경우,
MERGE
와 기초 테이블간에PACK_KEYS
테이블 옵션 값이 다르면 기초 테이블에CHAR
또는BINARY
컬럼이 포함 된 경우 예기치 않은 결과입니다. 해결 방법은ALTER TABLE
을 사용하여 관련된 모든 테이블에PACK_KEYS
값이 동일하다는 것을 보장합니다. (Bug # 50646)