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
일부 스토리지 엔진은 인덱스를 만들 때 인덱스 유형을 지정할 수 있습니다. 스토리지 엔진별로 지원되는 허용되는 인덱스 유형 값을 다음 표에 나타냅니다. 여러 인덱스 유형이 표시된 경우, 첫 번째가 인덱스 유형 지시자가 지정되지 않으면 기본입니다.
스토리지 엔진 허용되는 인덱스 유형 InnoDB
BTREE
MyISAM
BTREE
MEMORY
/HEAP
HASH
,BTREE
NDB
HASH
,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_name
index_type
옵션이 전과 후의 두 위치에서 지정된 경우는 마지막 옵션이 적용됩니다.TYPE
은type_name
USING
의 동의어로 인식됩니다. 그러나 권장되는 형식은type_name
USING
입니다.WITH PARSER
parser_name
이 옵션은
FULLTEXT
인덱스와 함께 만 사용할 수 있습니다. 이것은 전체 텍스트 인덱싱 설정 및 검색 작업에 특수 처리가 필요한 경우, 파서 플러그인을 인덱스에 연결합니다. 플러그인 작성의 자세한 내용은 섹션 24.2 "MySQL 플러그인 API" 를 참조하십시오.COMMENT '
string
'인덱스 정의는 최대 1024 문자 옵션의 주석을 포함 할 수 있습니다.
MySQL 5.6.6의 시점에서는 ALGORITHM
및 LOCK
절을 지정할 수 있습니다. 이 테이블 복사 방법과 인덱스가 변경되는 동안 테이블의 읽기 및 쓰기 병렬 처리 수준에 영향을 미칩니다. 여기에는 ALTER TABLE
문에서와 같은 의미가 있습니다. 자세한 내용은 섹션 13.1.7 "ALTER TABLE 구문" 을 참조하십시오.