DBMS를 조작하여 데이터베이스 테이블을 생성하고 데이터를 저장하는 경우 이때 실제 물리적 저장장치(HDD, SSD 등)에 저장됩니다. 실제로 C:\ProgramData\MySQL\MySQL Server 8.0\Data
(처음 설치 시 저장 경로를 따로 설정하지 않은 경우) 디렉토리에 들어가본다면 다음 이미지 처럼 생성한 db와 테이블에 대한 정보 및 저장된 데이터들이 존재함을 알 수 있습니다.
SHOW VARIABLES LIKE 'datadir';
명령을 이용해서 데이터가 저장된 위치를 알 수 있습니다.
인덱스 Index
는 자료구조의 일종으로 데이터를 효율적으로 찾을 수 있게 만들어주는 자료구조입니다. DB에서 인덱스는 테이블의 행(튜플, 레코드)의 키 값에 대한 물리적인 위치를 저장해둡니다.
그래서 어떤 레코드를 요구하면 인덱스에서 해당 레코드의 키 값 위치를 찾아내어 빠르게 탐색을 수행할 수 있도록 만들어줍니다.
대부분의 RDBMS
그리고 여기서 설명하고자하는 MySQL의 인덱스
는 B-Tree를 이용해서 인덱스를 구성합니다.
인덱스의 특징
은 다음과 같습니다.
이 특징들은
B-Tree
포스트에서 해당 자료구조의 특징들을 살펴보신다면 더 쉽게 이해할 수 있습니다.
그리고 이후 내용도B-Tree
에 대한 내용을 어느정도 포함한 채로 설명이 되기 때문에B-Tree
에 대한 이해도가 필요합니다.
정확히는 MySQL 구 버전에서 사용된 것이
B-Tree
,InnoDB 엔진
이 사용되는 버전부터는B+Tree
가 인덱스에 사용되고 있습니다.
B+Tree
는B-Tree
가 개선된 자료구조이므로 여기서는 기본이되는B-Tree
를 이용해서 설명합니다.
MySQL
에서 인덱스는 클러스터 인덱스, 보조 인덱스
로 나누어집니다. 두 인덱스 모두 B-Tree
기반의 인덱스입니다.
클러스터 인덱스
는 연속된 키 값(PK)을 가진 레코드들을 묶어서 같은 블록에 저장합니다. 테이블 당 하나의 클러스터 인덱스만 생성가능합니다.
클러스터 인덱스
는 다음과 같은 특징을 갖습니다.
보조 인덱스
는 PK 이외의 컬럼들에 대해 생성되는 인덱스입니다.
보조 인덱스
는 다음과 같은 특징을 갖습니다.
인덱스
는 다음 명령으로 생성할 수 있습니다.
CREATE INDEX 인덱스_이름
ON 테이블_이름(컬럼, ...);
데이터를 빠르게 찾을 수 있기만 한 것 처럼 이야기했지만 무조건적으로 인덱스가 빠르진 않습니다. 데이터 자체가 많이 없거나, 데이터 값의 경우가 적은 경우(flag 처럼 true/false 두 가지라던가)에는 오히려 인덱스 없이 사용하는게 더 빠를 수도 있습니다.
그래서 인덱스를 생성할 때는 다음과 같은 사항들을 고려해보고 생성해야합니다.
인덱스 생성 이후 테이블 내의 데이터가 변경되었다면 다음 명령어를 통해 인덱스를 재구성합니다.
ANALYZE TABLE 테이블_이름;
추가적으로 인덱스 삭제는 DROP
을 이용합니다.
DROP INDEX 인덱스_이름;