English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL 인덱스

MySQL 인덱스의 생성은 MySQL의 효율적인 실행에 매우 중요합니다. 인덱스는 MySQL의 검색 속도를 크게 향상시킬 수 있습니다.

예를 들어, 인덱스를 잘 설계하고 사용한 MySQL이 랜보르기니라면, 인덱스를 설계하고 사용하지 않은 MySQL은 인력 삼륜차입니다.

중국어 사전의 목차 페이지(인덱스)를 예로 들어, 풍자, 글자 수, 부수 등으로 정렬된 목차(인덱스)를 통해 필요한 글자를 빠르게 찾을 수 있습니다.

인덱스는 단일 열 인덱스와 조합 인덱스로 나뉩니다. 단일 열 인덱스는 하나의 인덱스가 단일 열만 포함하는 인덱스로, 하나의 테이블에 여러 개의 단일 열 인덱스가 있을 수 있지만, 이는 조합 인덱스가 아닙니다. 조합 인덱스는 하나의 인덱스가 여러 열을 포함하는 인덱스입니다.

인덱스를 생성할 때, 해당 인덱스가 SQL 쿼리 문장의 조건(일반적으로 WHERE 문장의 조건)에 적용되도록 확인해야 합니다.

실제로, 인덱스는 또 다른 테이블로, 이 테이블은 주키와 인덱스 필드를 저장하고 실체 테이블의 기록을 가리킵니다.

위에서는 인덱스 사용의 장점에 대해 설명했습니다. 그러나 인덱스를 과도하게 사용하면 부작용이 발생할 수 있습니다. 따라서 인덱스도 단점이 있습니다: 인덱스는 쿼리 속도를 크게 향상시키지만, 테이블을 업데이트할 때(INSERT, UPDATE, DELETE) 테이블 업데이트 속도를 줄입니다. 왜냐하면 테이블을 업데이트할 때 MySQL은 데이터를 저장하는 것 외에 인덱스 파일도 저장해야 합니다.

인덱스를 설정하면 디스크 공간을 차지하는 인덱스 파일이 생성됩니다.

일반 인덱스

인덱스 생성

이것은 가장 기본적인 인덱스로, 어떤 제한도 없습니다. 다음과 같은 몇 가지 생성 방법이 있습니다:

CREATE INDEX indexName ON table_name (column_name)

CHAR 및 VARCHAR 타입이면, 길이는 필드 실제 길이보다 작을 수 있습니다; BLOB 및 TEXT 타입이면 반드시 길이를 지정해야 합니다.

테이블 구조 수정(인덱스 추가)

ALTER table tableName ADD INDEX indexName(columnName)

테이블을 생성할 때 직접 지정

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
INDEX [indexName] (username(length))  
 
);

인덱스 제거 문법

DROP INDEX [indexName] ON mytable;

유일 인덱스

이는 이전 일반 인덱스와 유사하지만, 다른 점은 인덱스 열의 값이 유일해야 하며 공백 값이 허용되는 것입니다. 조합 인덱스라면 열 값의 조합이 유일해야 합니다. 다음과 같은 방식으로 생성할 수 있습니다:

인덱스 생성

CREATE UNIQUE INDEX indexName ON mytable(username(length))

테이블 구조 수정

ALTER table mytable ADD UNIQUE [indexName] (username(length))

테이블을 생성할 때 직접 지정

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
UNIQUE [indexName] (username(length))  
 
);

ALTER 명령어로 인덱스 추가 및 제거

데이터 테이블 인덱스를 추가하는 방법이 네 가지 있습니다:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 이 문장은 주키를 추가하며, 이는 인덱스 값이 유일해야 하고 NULL이 될 수 없다는 의미입니다.

  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 이 문장은 인덱스 값이 유일해야 하며 (NULL을 제외하고 NULL은 여러 번 나타날 수 있습니다) 요구합니다.

  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 일반 인덱스를 추가하면 인덱스 값이 여러 번 나타날 수 있습니다.

  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):이 문장은 인덱스가 FULLTEXT 인全文 인덱스를 지정합니다.

다음 예제는 테이블에 인덱스를 추가하는 것입니다.

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

ALTER 명령어에서 DROP 절을 사용하여 인덱스를 제거할 수 있습니다. 다음 예제를 통해 인덱스 제거를 시도해 보세요:

mysql> ALTER TABLE testalter_tbl DROP INDEX c;

ALTER 명령을 사용하여 기본 키 추가 및 제거

기본 키는 열에 영향을 미칩니다(한 개의 열이나 여러 열이 결합된 기본 키가 될 수 있습니다). 기본 키 인덱스를 추가할 때는 기본 키가 기본적으로 비어 있지 않도록 해야 합니다(NOT NULL). 예제는 다음과 같습니다:

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

또한 ALTER 명령을 사용하여 기본 키를 제거할 수 있습니다:

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

기본 키를 제거할 때는 PRIMARY KEY만 지정하면 됩니다. 하지만 인덱스를 제거할 때는 인덱스 이름을 알아야 합니다.

인덱스 정보 표시

SHOW INDEX 명령을 사용하여 테이블에 대한 관련 인덱스 정보를 나열할 수 있습니다. \G을 추가하여 출력 정보를 정렬할 수 있습니다.

다음 예제를 시도해 보세요:

mysql> SHOW INDEX FROM table_name; \G
........