반응형
인덱스란
- RDBMS에서 검색 속도를 높이기 위한 기술
- 어떤 데이터가 어느 위치에 있다는 정보를 가진 주소록
- 데이터베이스 안의 레코드를 처음부터 풀스캔하지 않고, B+-Tree로 구성된 구조에서 Index 파일 검색으로 속도를 향상시키는 기술
파일 구성
→ 테이블 생성 시, 3가지 파일 생성
- FRM : 테이블 구조 저장 파일
- MYD : 실제 데이터 파일
- MYI : Index 정보 파일 (Index 사용 시 생성)
→ 사용자가 쿼리를 통해 Index를 사용하는 칼럼을 검색하게 되면, 이때 MYI 파일의 내용을 활용한다.
인덱스를 사용하는 이유
- WHERE 구문과 일치하는 열을 빨리 찾기 위해서.
- 열을 고려 대상에서 빨리 없애 버리기 위해서
- 조인 (join)을 실행할 때 다른 테이블에서 열을 추출하기 위해서.
- 특정하게 인덱스된 컬럼을 위한 MIN() 또는 MAX() 값을 찾기 위해서.
- 사용할 수 있는 키의 최 좌측 접두사 (leftmost prefix)를 가지고 정렬 및 그룹화를 하기 위해서.
- 데이터 열을 참조하지 않는 상태로 값을 추출하기 위해서 쿼리를 최적화하는 경우에.
테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래 걸린다. 그래서 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 활용하는 것입니다.
단점
- Index 생성시, .mdb 파일 크기가 증가한다.
- 한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.
- 인덱스 된 Field에서 Data를 업데이트하거나, Record를 추가 또는 삭제시 성능이 떨어진다.
- 데이터 변경 작업이 자주 일어나는 경우, Index를 재작성해야 하므로 성능에 영향을 미친다.
사용하면 좋은 경우
- Where 절에서 자주 사용되는 Column
- 외래키가 사용되는 Column
- Join에 자주 사용되는 Column
사용하면 안 좋은 경우
- Data 중복도가 높은 Column
- DML이 자주 일어나는 Column
Index 자료구조
-
B-Tree 인덱스 알고리즘
- 항상 양쪽 자식의 밸런스를 유지
- 각 노드에 데이터가 저장
- 리프 노드를 읽기 전에 원하는 값을 찾을 수 있고, 탐색 시간이 탐색 키 수의 로그에 비례한다.
- O(logN)
-
Hash 인덱스 알고리즘
- 칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘.
- 매우 빠른 검색을 지원
- 값을 변형해서 인덱싱하기 때문에 값의 일부만으로 검색할 때는 사용 불가능
- 동등 연산(=)에 특화됨
- 부등호 연산에 문제 발생 → Index 생성시 B-Tree사용하는 이유
주의사항
다중 컬럼 인덱스(학번, 이름) 시 순서가 중요하다. (첫번째 인덱스는 무조건 있어야 한다.)
-> where 학번 = 1234 and 이름 = '~~~'; 학번은 무조건 있어야 하고, 학번이 없으면 인덱스를 이용하지 않는다.
Index 쿼리문
--추가
create index <인덱스명> on <테이블명> (컬럼명1, 컬럼명2, ...);
alter table <테이블명> add index(컬럼명(자료형사이즈));
--인덱스 보기 show index from <테이블명>;
--인덱스 삭제 alter table <테이블명> drop index <인덱스명>;
참고
https://helloinyong.tistory.com/296
https://yoo-hyeok.tistory.com/101
반응형