13.1.13 CREATE INDEX 구문
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEXindex_name[index_type] ONtbl_name(index_col_name,...) [index_option] [algorithm_option|lock_option] ...index_col_name:col_name[(length)] [ASC | DESC]index_type: USING {BTREE | HASH}index_option: KEY_BLOCK_SIZE [=]value|index_type| WITH PARSERparser_name| COMMENT 'string'algorithm_option: ALGORITHM [=] {DEFAULT|INPLACE|COPY}lock_option: LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}
CREATE INDEX 는 인덱스를 만드는 데 ALTER TABLE 문에 매핑됩니다. 섹션 13.1.7 "ALTER TABLE 구문" 을 참조하십시오. CREATE INDEX 를 사용하여 PRIMARY KEY 를 만들 수 없습니다. 대신 ALTER TABLE 을 사용합니다. 인덱스의 자세한 내용은 섹션 8.3.1 "MySQL의 인덱스 사용 방법" 을 참조하십시오.
일반적으로 테이블의 모든 인덱스는 테이블 자체가 CREATE TABLE 에서 작성된 시점에서 만듭니다. 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오. 이 지침은 기본 키에 의해 데이터 파일의 행의 물리적 배열이 결정되는 InnoDB 테이블의 경우에 특히 중요합니다. CREATE INDEX 는 기존의 테이블에 인덱스를 추가 할 수 있습니다.
(col1,col2,...) 형식의 컬럼리스트는 멀티 컬럼 인덱스를 만듭니다. 인덱스 키 값은 특정 컬럼의 값을 연결하여 형성됩니다.
구문을 사용하여 인덱스 프리픽스 길이를 지정하여 컬럼 값의 첫 부분만을 사용하는 인덱스를 만들 수 있습니다. col_name ( length )
프리픽스는
CHAR,VARCHAR,BINARY및VARBINARY컬럼에 지정할 수 있습니다.BLOB및TEXT컬럼에 인덱스를 설정할 수 있지만, 프리픽스 길이를 지정해야합니다.프리픽스 길이는 바이너리가 아닌 문자열의 경우는 문자에서 이진 문자열 형의 경우는 바이트 단위로 지정됩니다. 즉, 인덱스 항목은
CHAR,VARCHAR및TEXT컬럼의 경우 각 컬럼 값의 첫 번째length문자BINARY,VARBINARY, 그리고BLOB컬럼의 경우 각 컬럼 값의 첫 번째length바이트로 구성됩니다.이 섹션의 나머지 부분에서 설명 된 바와 같이, 공간 컬럼의 경우 접두어 값을 지정할 수 없습니다.
다음 문은 name 컬럼의 최초의 10 문자를 사용하여 인덱스를 만듭니다.
CREATE INDEX part_of_name ON customer (name (10));
컬럼의 이름이 일반적으로 처음 10 자 다른 경우는이 인덱스가 name 컬럼 전체에서 생성 된 인덱스보다 훨씬 느린 것은 없을 것입니다. 또한 인덱스 컬럼 접두어를 사용하면 인덱스 파일을 훨씬 작게 할 수 있기 때문에 많은 디스크 공간이 절약 될뿐만 아니라 INSERT 작업도 가속화 될 가능성이 있습니다.
프리픽스의 지원과 프리픽스의 길이 (지원되는 경우)는 스토리지 엔진에 의존합니다. 예를 들어, InnoDB 테이블에서는 프리픽스의 길이를 최대 767 바이트이며 또한 innodb_large_prefix 옵션이 활성화되어있는 경우는 3072 바이트로 할 수 있습니다. MyISAM 테이블의 경우, 프리픽스의 제한은 1000 바이트입니다.
프리픽스의 제한이 바이트 단위로 측정되는 반면 CREATE INDEX 문에서 프리픽스 길이는 바이너리가 아닌 데이터 형식 ( CHAR , VARCHAR , TEXT )는 문자로 해석됩니다. 멀티 바이트 문자 집합을 사용하는 컬럼의 프리픽스 길이를 지정하는 경우이 점을 고려하십시오.
NDBCLUSTER 테이블의 가변 폭 컬럼의 인덱스는 온라인으로, 즉 테이블 복사 할 필요없이 생성됩니다. 이 테이블은이 작업 기간 동안 동일한 API 노드에 대한 다른 작업에 대해 잠겨 있지만 다른 MySQL Cluster API 노드에서 액세스에 잠겨 없습니다. 이것은 서버가 실행할 수 있다고 판단하는 경우 항상 그 서버에서 자동으로 실행됩니다. 이를 위해 특수 SQL 구문이나 서버 옵션을 사용할 필요가 없습니다.
표준의 MySQL 5.6 릴리즈에서는 서버가 테이블 복사없이 인덱스를 작성하기로 결정했을 때, 그 서버를 재정의 할 수 없습니다. MySQL Cluster는 OFFLINE 키워드를 사용하여 인덱스를 오프라인으로 만들 수 있습니다 (이렇게하면 그 테이블은 클러스터의 모든 API 노드에 잠겨 있습니다). CREATE OFFLINE INDEX 및 CREATE ONLINE INDEX 를 관리하는 규칙이나 제한은 ALTER OFFLINE TABLE ... ADD INDEX 및 ALTER ONLINE TABLE ... ADD INDEX 의 경우와 동일합니다. ONLINE 키워드를 사용하여 일반적으로 오프라인에서 작성되는 인덱스의 복사없이 작성이 실행되도록 할 수 없습니다. CREATE INDEX 작업을 테이블 복사없이 실행할 수없는 경우 서버는 ONLINE 키워드를 무시합니다. 자세한 내용은 섹션 13.1.7.2 "MySQL Cluster에서 ALTER TABLE 온라인 작업" 을 참조하십시오.
ONLINE 및 OFFLINE 키워드는 MySQL Cluster에서만 사용할 수 있습니다. 이러한 키워드를 표준 MySQL Server 5.6 릴리스에서 사용하려고하면 구문 오류가 발생합니다. ONLINE 및 OFFLINE 키워드는 MySQL Cluster NDB 7.3에서 비추천입니다. MySQL Cluster NDB 7.4에서 계속 지원되지만 향후 MySQL Cluster 릴리스에서 제거 될 수 있습니다.
UNIQUE 인덱스는 인덱스의 모든 값이 달라야하는 제한 조건을 작성합니다. 기존 행에 일치하는 키 값을 갖는 새 행을 추가하려고하면 오류가 발생합니다. 모든 엔진에 대한 UNIQUE 인덱스는 NULL 을 포함 할 수있다 컬럼에서 여러 NULL 값을 허용합니다. UNIQUE 인덱스 컬럼의 프리픽스 값을 지정하려면 컬럼 값이 프리픽스 내에서 고유해야합니다.
FULLTEXT 인덱스는 InnoDB 와 MyISAM 테이블에서만 지원되며, CHAR , VARCHAR 및 TEXT 컬럼 만 포함 할 수 있습니다. 인덱스 설정은 항상 컬럼 전체에 대해 수행됩니다. 컬럼 접두어 인덱싱은 지원되지 않기 때문에 프리픽스 길이가 지정 되어도 무시됩니다. 작업의 자세한 내용은 섹션 12.9 "전체 텍스트 검색 함수" 를 참조하십시오.
MyISAM , InnoDB , NDB 및 ARCHIVE 스토리지 엔진은 POINT 과 GEOMETRY 등의 공간 컬럼을 지원하고 있습니다. ( 섹션 11.5 "공간 데이터의 확장 ' 에서는 공간 데이터 형식에 대해 설명하고있다.) 그러나 공간 컬럼의 인덱스 설정에 대한 지원은 엔진에 따라 다릅니다. 공간 및 비 공간 인덱스는 다음 규칙에 따라 사용할 수 있습니다.
( SPATIAL INDEX 를 사용하여 생성 된) 공간 인덱스는 다음과 같은 특징이 있습니다.
MyISAM테이블에서만 사용할 수 있습니다. 다른 스토리지 엔진에SPATIAL INDEX를 지정하면 오류가 발생합니다.인덱스 컬럼은
NOT NULL이어야합니다.MySQL 5.6에서는 컬럼 프리픽스 길이는 금지되어 있습니다. 각 컬럼의 폭 전체에 인덱스가 설정됩니다.
INDEX , UNIQUE 또는 PRIMARY KEY 로 만든 비 공간 인덱스의 특성은 다음과 같습니다.
ARCHIVE을 제외한 공간 컬럼을 지원하는 모든 스토리지 엔진에 대해 허용됩니다.인덱스가 기본 키가 아닌 한, 컬럼을
NULL로 할 수 있습니다.POINT컬럼을 제외한 비SPATIAL인덱스의 공간 컬럼에 대해 컬럼 프리픽스 길이를 지정해야합니다. (이것은 인덱스BLOB컬럼의 경우와 같은 요구 사항입니다.) 프리픽스 길이는 바이트 단위로 지정됩니다.비
SPATIAL인덱스의 인덱스 유형은 스토리지 엔진에 따라 다릅니다. 현재는 B 트리가 사용됩니다.
MySQL 5.6는 다음과 같습니다.
NULL값을 가질 수가있는 컬럼에 인덱스를 추가 할 수는InnoDB,MyISAM또는MEMORY스토리지 엔진을 사용하는 경우뿐입니다.BLOB또는TEXT컬럼에 인덱스를 추가 할 수는InnoDB또는MyISAM스토리지 엔진을 사용하는 경우뿐입니다.innodb_stats_persistent설정이 활성화되어 있다면,InnoDB테이블에서 인덱스를 작성한 후 해당 테이블에 대해ANALYZE TABLE문을 실행합니다.
index_col_name 의 지정을 ASC 또는 DESC 로 종료시킬 수 있습니다. 이러한 키워드는 인덱스 값의 오름차순 또는 내림차순으로 저장을 지정하는 미래의 확장을 위해 허용되어 있습니다. 현재 이들은 분석되지만 무시됩니다. 인덱스 값은 항상 오름차순으로 저장됩니다.
인덱스 컬럼리스트의 후에 인덱스 옵션을 지정할 수 있습니다. index_option 값은 다음 중 하나를 지정할 수 있습니다.
KEY_BLOCK_SIZE [=]value옵션으로 인덱스 키의 블록에 사용하는 크기를 바이트 단위로 지정합니다. 이 값은 팁으로 처리됩니다. 필요에 따라 다른 크기를 사용할 수 있습니다.
참고KEY_BLOCK_SIZE은InnoDB에 테이블 레벨에서만 지원됩니다. 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오.index_type일부 스토리지 엔진은 인덱스를 만들 때 인덱스 유형을 지정할 수 있습니다. 스토리지 엔진별로 지원되는 허용되는 인덱스 유형 값을 다음 표에 나타냅니다. 여러 인덱스 유형이 표시된 경우, 첫 번째가 인덱스 유형 지시자가 지정되지 않으면 기본입니다.
스토리지 엔진 허용되는 인덱스 유형 InnoDBBTREEMyISAMBTREEMEMORY/HEAPHASH,BTREENDBHASH,BTREE(텍스트의 주를 참조하십시오)예 :
CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index ON lookup (id) USING BTREE;
BTREE인덱스는NDBCLUSTER스토리지 엔진에 의해 T 트리 인덱스로 구현됩니다.참고NDB테이블 컬럼에 대한 인덱스의 경우USING옵션은 고유 인덱스 또는 기본 키에 대해서만 지정할 수 있습니다.USING HASH는 암시 적 정렬 된 인덱스가 생성되지 않도록합니다. 그렇지 않으면,NDB테이블에 고유 인덱스 또는 기본 키를 만들 때 정렬 된 인덱스와 해시 인덱스가 모두 자동으로 생성되어 각각이 같은 일련의 컬럼에 인덱스를 설정합니다.즉,
NULL컬럼에서 고유 인덱스 또는 기본 키를 사용하는 쿼리는 항상NDB의해 테이블 전체 스캔으로 처리됩니다. 특히NDB테이블의 고유 인덱스 또는 기본 키 컬럼에 관련한IS NULL또는IS NOT NULL조건을 사용하려는 경우 이러한 인덱스를 모두USING HASH없이 작성하도록하십시오.index_type절을SPATIAL INDEX와 함께 사용할 수 없습니다.특정 스토리지 엔진에 대해 유효하지 않은 인덱스 유형을 지정했지만 그 엔진이 쿼리 결과에 영향을주지 않고 사용할 수있는 사용 가능한 다른 인덱스 타입이 존재하는 경우, 엔진이 사용 가능한 유형을 사용 합니다. 파서는
RTREE를 입력 이름으로 인식하지만 현재 이것은 어떤 스토리지 엔진에 지정할 수 없습니다.이 옵션을
ON절 앞에 사용하는 것은 비추천입니다. 이 옵션을이 위치에서 사용하기위한 지원은 미래의 MySQL 릴리스에서 제거 될 예정입니다.tbl_nameindex_type옵션이 전과 후의 두 위치에서 지정된 경우는 마지막 옵션이 적용됩니다.TYPE은type_nameUSING의 동의어로 인식됩니다. 그러나 권장되는 형식은type_nameUSING입니다.WITH PARSERparser_name이 옵션은
FULLTEXT인덱스와 함께 만 사용할 수 있습니다. 이것은 전체 텍스트 인덱싱 설정 및 검색 작업에 특수 처리가 필요한 경우, 파서 플러그인을 인덱스에 연결합니다. 플러그인 작성의 자세한 내용은 섹션 24.2 "MySQL 플러그인 API" 를 참조하십시오.COMMENT 'string'인덱스 정의는 최대 1024 문자 옵션의 주석을 포함 할 수 있습니다.
MySQL 5.6.6의 시점에서는 ALGORITHM 및 LOCK 절을 지정할 수 있습니다. 이 테이블 복사 방법과 인덱스가 변경되는 동안 테이블의 읽기 및 쓰기 병렬 처리 수준에 영향을 미칩니다. 여기에는 ALTER TABLE 문에서와 같은 의미가 있습니다. 자세한 내용은 섹션 13.1.7 "ALTER TABLE 구문" 을 참조하십시오.