Loading...
MySQL 9.5 Reference Manual 9.5의 18.7 The MERGE Storage Engine의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
18.7.1 MERGE Table Advantages and Disadvantages 18.7.2 MERGE Table Problems
MERGE storage engine은 MRG_MyISAM engine이라고도 하며, 하나로 사용할 수 있는 동일한 MyISAM 테이블들의 모음입니다. “동일한(identical)”이란 모든 테이블이 동일한 컬럼 데이터 타입과 인덱스 정보를 가진다는 뜻입니다. 컬럼의 나열 순서가 다르거나, 대응되는 컬럼에서 데이터 타입이 정확히 같지 않거나, 인덱스의 순서가 다른 MyISAM 테이블은 머지할 수 없습니다.
그러나 다음과 같은 차이는 있어도 아무런 문제가 없으며, MyISAM 테이블은 어느 것이든 또는 모두 myisampack으로 압축할 수 있습니다. 자세한 내용은 Section 6.6.6, “myisampack — Generate Compressed, Read-Only MyISAM Tables”을 참조하십시오. 다음과 같은 테이블 간의 차이는 중요하지 않습니다:
대응되는 컬럼과 인덱스의 이름은 달라도 됩니다.
테이블, 컬럼, 인덱스에 대한 코멘트는 달라도 됩니다.
AVG_ROW_LENGTH, MAX_ROWS, PACK_KEYS 같은 테이블 옵션은 달라도 됩니다.
MERGE 테이블의 대안은 파티션 테이블입니다. 파티션 테이블은 하나의 테이블의 파티션을 별도의 파일에 저장하며, 일부 연산을 더 효율적으로 수행할 수 있게 합니다. 자세한 내용은 Chapter 26, Partitioning을 참조하십시오.
MERGE 테이블을 생성하면, MySQL은 디스크에 .MRG 파일을 만들어 하나로 사용될 기본 MyISAM 테이블들의 이름을 그 안에 기록합니다. MERGE 테이블의 테이블 포맷은 MySQL 데이터 딕셔너리에 저장됩니다. 기본 테이블들은 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 테이블을 생성하는 방법을 보여줍니다:
1mysql> CREATE TABLE t1 ( 2 -> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 -> message CHAR(20)) ENGINE=MyISAM; 4mysql> CREATE TABLE t2 ( 5 -> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 6 -> message CHAR(20)) ENGINE=MyISAM; 7mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1'); 8mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2'); 9mysql> CREATE TABLE total ( 10 -> a INT NOT NULL AUTO_INCREMENT, 11 -> message CHAR(20), INDEX(a)) 12 -> ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
컬럼 a는 기본 MyISAM 테이블에서는 PRIMARY KEY로 인덱스되어 있지만, MERGE 테이블에서는 그렇지 않습니다. MERGE 테이블에서는 인덱스되어 있지만 PRIMARY KEY는 아닙니다. 그 이유는 MERGE 테이블이 기본 테이블 집합 전체에 대해 유니크함을 강제할 수 없기 때문입니다. (마찬가지로 기본 테이블에서 UNIQUE 인덱스가 지정된 컬럼은 MERGE 테이블에서도 인덱스되어야 하지만, UNIQUE 인덱스로는 지정되지 않아야 합니다.)
MERGE 테이블을 생성한 후에는, 이를 사용하여 전체 테이블 그룹에 대해 수행되는 쿼리를 발행할 수 있습니다:
1mysql> SELECT * FROM total; 2+---+---------+ 3| a | message | 4+---+---------+ 5| 1 | Testing | 6| 2 | table | 7| 3 | t1 | 8| 1 | Testing | 9| 2 | table | 10| 3 | t2 | 11+---+---------+
MERGE 테이블을 다른 MyISAM 테이블 모음으로 다시 매핑(remap)하려면, 다음 방법 중 하나를 사용할 수 있습니다:
MERGE 테이블을 DROP한 후 다시 생성합니다.
ALTER TABLE tbl_name UNION=(...)을 사용하여 기본 테이블 목록을 변경합니다.
또한 ALTER TABLE ... UNION=() (즉, 비어 있는 UNION 절과 함께)을 사용하여 모든 기본 테이블을 제거하는 것도 가능합니다. 그러나 이 경우, 해당 테이블은 사실상 비어 있게 되며 새로운 로우를 수용할 기본 테이블이 없으므로 인서트가 실패합니다. 이런 테이블은 CREATE TABLE ... LIKE을 사용해 새로운 MERGE 테이블을 생성하기 위한 템플릿으로 유용할 수 있습니다.
기본 테이블 정의와 인덱스는 MERGE 테이블의 정의와 밀접하게 일치해야 합니다. 일치 여부는 MERGE 테이블이 생성될 때가 아니라, MERGE 테이블의 일부인 테이블이 오픈될 때 확인됩니다. 어떤 테이블이든 일치 검사에 실패하면, 해당 테이블의 오픈을 유발한 연산이 실패합니다. 이는 MERGE 내에 있는 테이블 정의 변경이 MERGE 테이블에 접근할 때 실패를 일으킬 수 있음을 의미합니다. 각 테이블에 적용되는 일치 검사는 다음과 같습니다:
기본 테이블과 MERGE 테이블은 같은 개수의 컬럼을 가져야 합니다.
기본 테이블과 MERGE 테이블의 컬럼 순서는 일치해야 합니다.
추가적으로, 부모 MERGE 테이블과 기본 테이블에서 각 대응 컬럼에 대한 스펙을 비교하며, 다음 검사를 통과해야 합니다:
기본 테이블과 MERGE 테이블의 컬럼 타입은 같아야 합니다.
기본 테이블과 MERGE 테이블의 컬럼 길이는 같아야 합니다.
기본 테이블의 컬럼과 MERGE 테이블의 컬럼은 NULL일 수 있습니다.
기본 테이블은 MERGE 테이블보다 적어도 많은 개수의 인덱스를 가져야 합니다. 기본 테이블이 MERGE 테이블보다 더 많은 인덱스를 가질 수는 있지만, 더 적게 가질 수는 없습니다.
참고
알려진 이슈로, 동일한 컬럼에 대한 인덱스는 MERGE 테이블과 기본 MyISAM 테이블 모두에서 순서가 완전히 동일해야 합니다. Bug #33653를 참조하십시오.
각 인덱스는 다음 검사를 통과해야 합니다:
기본 테이블과 MERGE 테이블의 인덱스 타입은 같아야 합니다.
기본 테이블과 MERGE 테이블의 인덱스 정의에서 인덱스 파트(즉, 복합 인덱스 내의 여러 컬럼)의 개수는 같아야 합니다.
각 인덱스 파트에 대해:
인덱스 파트 길이는 같아야 합니다.
인덱스 파트 타입은 같아야 합니다.
인덱스 파트 언어는 같아야 합니다.
인덱스 파트가 NULL 가능인지 여부를 확인합니다.
기본 테이블에 문제가 있어서 MERGE 테이블을 오픈하거나 사용할 수 없는 경우, CHECK TABLE이 어떤 테이블이 문제를 일으켰는지에 대한 정보를 표시합니다.
MERGE storage engine에 특화된 포럼이 https://forums.mysql.com/list.php?93에 있습니다.18.6 The BLACKHOLE Storage Engine
18.7.1 MERGE Table Advantages and Disadvantages