INDEX
•
테이블에서 원하는 많은 양의 데이터를 쉽고 빠르게 찾기 위해 사용합니다.
•
지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것입니다.
•
INSERT, UPDATE, DELETE의 성능을 희생하고 SELECT의 성능을 향상시킵니다.
•
(UPDATE, DELETE를 하기 위해 데이터를 조회할 땐 인덱스를 통해 빠르게 처리됩니다.)
INDEX를 사용하는 이유
•
SQL문을 변경하지 않고 성능을 개선할 수 있습니다.
•
테이블의 데이터에 영향을 주지 않습니다.
INDEX를 만드는 기준
•
조회 시 자주 사용하는 크기가 큰 테이블만 만듭니다.
◦
크기가 작은 테이블은 큰 차이가 없습니다.
•
PRIMARY KEY나 UNIQUE 제약조건이 부여된 컬럼에는 불필요합니다.
◦
PK나 UNIQUE가 설정된 컬럼은 자동으로 인덱스가 생성됩니다.
•
Cardinality가 높은 컬럼에 만듭니다.
◦
값의 분산도(종류)가 높을 수록 인덱스의 효과가 상승합니다.
•
컬럼 값에 NULL이 적은 컬럼에 만듭니다.
◦
NULL이 지나치게 많으면 효율이 떨어집니다.
INDEX 생성
-- 단일 컬럼 인덱스
CREATE (UNIQUE) INDEX [인덱스이름]
ON [테이블이름(컬럼이름 ASC or DESC)];
-- 다중 컬럼 인덱스
CREATE (UNIQUE) INDEX [인덱스이름]
ON [테이블이름(컬럼이름, 컬럼이름, ...)];
SQL
복사
•
UNIQUE 를 통해 UNIQUE INDEX를 설정할 수 있습니다.
•
인덱스 생성 시점에 컬럼의 정렬방식을 설정할 수 있습니다.
•
다중 컬럼은 최대 15개까지 구성 가능합니다.
•
다중 컬럼 인덱스는 단일 컬럼 인덱스보다 비효율적으로 INSERT, UPDATE, DELETE를 수행합니다.
INDEX 조회
SHOW INDEX
FROM [테이블이름];
SQL
복사
•
Table : 테이블의 이름
•
Non_unique : 인덱스가 중복된 값을 저장할 수 있으면 1, 없으면 0
•
Key_name : 인덱스의 이름을 표시하며, 인덱스가 해당 테이블의 기본 키라면 PRIMARY 표시
•
Seq_in_index : 인덱스에서의 해당 컬럼의 순서를 표시
•
Column_name : 해당 컬럼의 이름을 표시
•
Collation : 인덱스에서 해당 필드가 정렬되는 방법을 표시
•
Cardinality : 인덱스에 저장된 유일한 값들의 수
•
Sub_part : 인덱스 접두어를 표시
•
Packed : 키가 압축되는 방법을 표시
•
Null : 해당 컬럼이 NULLABLE하면 YES, 아니면 공백
•
Index_type : 인덱스에 사용되는 메서드
•
Comment : 해당 컬럼을 설명하는 것이 아닌 인덱스에 관한 기타 정보
•
Index_comment : 인덱스에 관한 모든 기타 정보
INDEX 추가
ALTER TABLE [테이블이름]
ADD (UNIQUE or FULLTEXT) INDEX [인덱스이름(컬럼이름, 컬럼이름, ...)];
SQL
복사
•
UNIQUE 를 통해 UNIQUE INDEX를 추가할 수 있습니다.
•
FULLTEXT INDEX는 테이블의 모든 텍스트 필드를 검색합니다.
◦
자연어를 이용하여 데이터를 검색할 수 있도록 모든 데이터의 문자열 단어를 저장합니다.
INDEX 삭제
-- ALTER문으로 인덱스 삭제
ALTER TABLE [테이블이름]
DROP INDEX [인덱스이름];
-- DROP문으로 인덱스 삭제
DROP INDEX [인덱스이름]
ON [테이블이름];
SQL
복사
INDEX 타는지 확인하기
EXPLAIN
SELECT ~
SQL
복사
•
상단에 EXPLAIN을 입력하면 어떤 방식으로 조회하는지 보여줍니다.
•
type이 ALL인 경우엔 INDEX를 타지 않았다는 것입니다.
•
type이 ref인 경우엔 possible_keys를 통해 어느 인덱스를 타는지 확인할 수 있습니다.