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)