15.7 MERGE 스토리지 엔진
MRG_MyISAM
엔진으로도 알려져있는 MERGE
스토리지 엔진은 하나의 테이블로 사용할 수있는 동일한 MyISAM
테이블의 모임입니다. '동일한'라는 것은 모든 테이블이 동일한 컬럼과 인덱스 정보를 가지고 있다는 의미입니다. 열이 다른 순서로 나열되어 있거나, 완전히 동일한 컬럼이 아니거나 인덱스의 순서가 차이가 나거나하면 MyISAM
테이블을 병합 할 수 없습니다. 그러나 MyISAM
테이블 전체 또는 중 하나를 myisampack로 압축 할 수 있습니다. 섹션 4.6.5 "myisampack - 압축 된 읽기 전용 MyISAM 테이블 생성" 을 참조하십시오. AVG_ROW_LENGTH
, MAX_ROWS
, PACK_KEYS
와 같은 테이블 옵션의 차이는 문제가 없습니다.
MERGE
테이블을 대체 파티션 된 테이블이며 하나의 테이블 파티션을 별도의 파일에 저장합니다. 파티셔닝은 일부 작업을보다 효율적으로 수행 할 수 있으며 MyISAM
스토리지 엔진에 제한되지 않습니다. 자세한 내용은 19 장 "분할" 을 참조하십시오.
MERGE
테이블을 만들 때, MySQL은 디스크에 두 개의 파일을 만듭니다. 파일 이름은 테이블 이름으로 시작하고 파일 유형을 나타내는 확장자가 붙습니다. .frm
파일은 테이블 포맷을 저장하고 .MRG
파일은 하나의 테이블로 사용해야 기초 MyISAM
테이블 이름을 포함합니다. 이 테이블은 MERGE
테이블과 같은 데이터베이스에있을 필요는 없습니다.
MERGE
테이블은 SELECT
, DELETE
, UPDATE
및 INSERT
를 사용할 수 있습니다. MERGE
테이블에 매핑하는 MyISAM
테이블에 대해 SELECT
, DELETE
및 UPDATE
권한이 필요합니다.
MERGE
테이블을 사용하면 다음과 같은 보안 문제를 일으 킵니다. 사용자가 MyISAM
테이블 t
에 대한 액세스 권한을 가지고 있으며, 그 사용자는 t
에 액세스 할 수 MERGE
테이블 m
을 만들 수 있습니다. 그러나 t
에 대한 사용자 권한이 나중에 삭제 된 경우 사용자는 m
을 통해 액세스하여 t
에 액세스를 계속할 수 있습니다.
DROP TABLE
을 MERGE
테이블에 사용하면 MERGE
지정 만 삭제됩니다. 기초 테이블은 영향을받지 않습니다.
MERGE
테이블을 만들려면 어떤 MyISAM
테이블을 사용 하는지를 나타내는 UNION=(
옵션을 지정해야합니다. 옵션으로 list-of-tables
)INSERT_METHOD
옵션을 지정하여 MERGE
테이블에 삽입하는 방법을 제어 할 수 있습니다. FIRST
또는 LAST
값을 사용하면 각각 첫 번째 또는 마지막 기본 테이블에 삽입이 실행되게됩니다. INSERT_METHOD
옵션을 지정하지 않거나 값 NO
함께이 옵션을 지정하면 MERGE
테이블에 삽입은 허용되지 않고 삽입 시도는 오류입니다.
다음의 예는 MERGE
테이블을 만드는 방법을 소개하고 있습니다.
mysql>CREATE TABLE t1 (
->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->message CHAR(20)) ENGINE=MyISAM;
mysql>CREATE TABLE t2 (
->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->message CHAR(20)) ENGINE=MyISAM;
mysql>INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql>INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql>CREATE TABLE total (
->a INT NOT NULL AUTO_INCREMENT,
->message CHAR(20), INDEX(a))
->ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
컬럼 a
는 PRIMARY KEY
로 기초 MyISAM
테이블에서 인덱스를 붙일 수 있습니다 만, MERGE
테이블에서는 인덱스를 붙일 수 없습니다. MERGE
테이블은 기본 테이블 세트에 고유성을 적용 할 수 없기 때문에 인덱스는 설정되지만, PRIMARY KEY
로 설정되지 않습니다. (마찬가지로 기초 테이블에 UNIQUE
인덱스를 가지는 열은 MERGE
테이블에 인덱스를 붙일 수 있지만 UNIQUE
인덱스로 붙일 수 없을 것입니다.)
MERGE
테이블을 생성 한 뒤,이 테이블을 사용하여 테이블 그룹화 작업을 할 쿼리를 실행할 수 있습니다.
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
MERGE
테이블을 MyISAM
테이블의 다른 컬렉션에 다시 매핑하려면 다음 방법 중 하나를 사용할 수 있습니다.
MERGE
테이블을DROP
하고 다시 만듭니다.기초 테이블의 목록을 변경하기 위해
ALTER TABLE
를 이용한다.tbl_name
UNION=(...)ALTER TABLE ... UNION=()
(즉, 빈UNION
절)을 사용하여 모든 기본 테이블을 제거 할 수 있습니다. 그러나이 경우, 테이블은 실질적으로는 비어 있고 새로운 행을 검색하는 기초 테이블이 없기 때문에 삽입은 실패합니다. 이러한 테이블은 새로운MERGE
테이블을CREATE TABLE ... LIKE
로 만들기위한 템플릿으로 도움이 될 수 있습니다.
기초 테이블 정의와 인덱스는 MERGE
테이블 정의와 정확히 일치해야합니다. 일치가 확인되는 것은 MERGE
테이블이 작성된 시점이 아니라 MERGE
테이블의 일부 테이블을 열 때입니다. 어느 테이블도 일치 확인에 실패했을 경우, 테이블의 오픈을 트리거 한 작업이 실패합니다. 즉, MERGE
의 테이블의 정의를 변경하면 MERGE
테이블에 액세스 할 때 실패의 원인이 될 수 있습니다. 각각의 테이블에 적용되는 규칙 검사는 다음과 같습니다.
기초 테이블과
MERGE
테이블의 컬럼 수는 같지 않으면 안됩니다.기초 테이블과
MERGE
테이블의 컬럼 순서는 일치해야합니다.또한 부모의
MERGE
테이블 내의 대응하는 각 컬럼의 지정 및 기초 테이블의 지정을 비교하여 다음의 체크 사항을 충족해야합니다.기초 테이블과
MERGE
테이블의 컬럼의 형태는 일치해야한다.기초 테이블과
MERGE
테이블의 컬럼의 길이는 일치해야한다.기초 테이블과
MERGE
테이블의 컬럼은NULL
이라도 상관 없다.
기초 테이블은 적어도
MERGE
테이블과 같은 수의 인덱스를 가질 필요가있다. 기초 테이블 인덱스의 수는MERGE
테이블보다 많아도 상관 없지만 적어도 수 없다.참고같은 컬럼의 인덱스는
MERGE
테이블과 기초MyISAM
테이블에서 모두 똑같은 순서이어야한다는 알려진 문제가 존재합니다. 버그 # 33653를 참조하십시오.각 인덱스는 다음 검사 내용을 충족해야합니다.
기초 테이블과
MERGE
테이블의 인덱스 유형은 일치 할 필요가있다.기초 테이블과
MERGE
테이블의 인덱스 정의의 인덱스 부분의 수 (즉, 복합 인덱스에 여러 컬럼)는 일치해야합니다.각 인덱스 부분에 대해.
인덱스 부분의 길이는 같지 않으면 안된다.
인덱스 부분의 형태는 동일해야 말라.
인덱스 부분의 언어는 동일해야 말라.
인덱스 부분이
NULL
로 상관 없다 여부를 체크한다.
MERGE
테이블이 기본 테이블의 문제에 대한 열거 나 사용 할 수없는 경우 CHECK TABLE
은 문제의 원인이 된 테이블에 대한 정보를 표시합니다.
추가 리소스
MERGE
스토리지 엔진에 특화된 포럼은 http://forums.mysql.com/list.php?93 에서 볼 수 있습니다.