인덱싱이란?
- DB 조회시 더 빠르게 할 수 있는 방법. 책 맨 첫페이지에 있는 목차 느낌
- column(속성), 해당 레코드가 저장된 주소를 Key - value 쌍으로 인덱스를 만들어 두는 것
c.f) MariaDB
- 디폴트로 PK, FK 컬럼에 대해 인덱스 테이블을 만들어놓는다.
- 기본값으로 B-Tree 사용한다고 명시되어있다. 정확하게는 B-Tree에서 성능을 개선한 B+Tree를 사용한다.
- 확인 CLI:
show index from ${table}
인덱스의 장단점
- 장점
- 테이블 조회 속도 향상
- 단점
- 인덱스 관리를 위해 별도의 (약 10%) 관리공간 추가적 필요
- 추가 작업 필요
- 잘못 사용하면 오히려 역효과 발생할 수 있음
Index를 사용할 때의 성능, 주의할 점
: 항상 성능을 향상시키지는 않음
성능 저하(사용하면 안 좋은 곳)
- INSERT, DELETE, UPDATE가 많은 곳(DML(데이터 조작 언어) 자주 일어나는 컬럼)
- INSERT - 인덱스에 대한 데이터 하나 추가해야 함
- DELETE - 인덱스를 삭제하지 않고 사용하지 않음 처리
- 만약 데이터가 10만건, 인덱스가 100만건 있다고 가정하면 오히려 역효과
- UPDATE - INSERT와 DELETE의 문제점 동시에 수반
- 더 중요한 것 : 컬럼을 이루는 데이터의 형식에 따라 인덱스에 악영향(데이터 중복이 큰 컬럼)
- e.g. 이름, 나이, 성별 필드를 갖는 테이블의 경우 : 이름에 대해서만 인덱싱을 생성하면 효율적이다. 나이로 인덱싱 되어있으면 일단 B-Tree에서 원하는 노드를 찾아간 후 원하는 컬럼을 찾기위해 추가조회를 하면서 성능이 좋지 않아진다.
사용하면 좋은 곳
- 규모가 작지 않은 테이블
- join(외래 키) 로 사용되는 컬럼
- where, orderby 자주 사용되는 컬럼
- 데이터 중복 적은 컬럼(카디널리티가 높은 것)
Index 자료구조
B+Tree 인덱스 알고리즘
- 일반적으로 사용되는 인덱스 알고리즘. (Maria DB, Mongo의 default)
- 컬럼의 값을 변경하지 않고 (앞 부분만 잘라서 관리 : 전방 일치) 원래의 값을 이용해 인덱싱
- Select 질의에 일반적으로 부등호 연산이 있기 때문에 Hash보다는 B+ Tree를 사용
- B-Tree와 다르게, Non-leaf에는 leaf로 가기 위한 경로만 있다. 따라서, 불가피하게 실제 값까지 가기 위해선 leaf까지 항상 도달해야한다 -> log N
- leaf node에는 인덱싱한 값 존재(e.g PK)
Hash 인덱스 알고리즘
- 컬럼의 값으로 해시 값을 계산해서 인덱싱 - 속도가 빠름 O(1)
- 값을 변경해서 인덱싱하기 때문에, 특정 문자로 전방 일치를 찾아 검색하고자 하는 경우 사용 불가
- 부등호 연산에 문제가 발생(hash table은 동일(=) 연산에 특화되어 있음)
- 부등호가 필요하지 않은 케이스에 이 알고리즘을 선택하면 더 효율이 좋을 수 있다.
Clustered index
- 비슷한 것들을 묶어서 저장하는 형태.
- 주로 비슷한 값들을 동시에 조회하는 경우가 많기 때문
- PK 값이 비슷한 레코드끼리 묶어서 저장하는 것
- PK값에 의해 저장 위치가 결정. 따라서, PK 변경 시 저장 위치도 변경됨
- 신중한 선택이 필요
- 테이블 당 하나 생성 가능 <-> non clustered는 한 테이블에 여럿 생성 가능
Composite Index (결합 인덱스)
- 두개의 컬럼을 결합해 자주 사용되는 곳에서.
- 그런데, 첫번째 인덱스, 두번째 인덱스 순으로 결합했는데 두번째로 검색을 한다면 효과없음
- 쿼리문을 어떻게 작성할지도 중요
Reference)
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/%5BDB%5D%20Index.md
https://github.com/WeareSoft/tech-interview/blob/master/contents/db.md#index%EB%9E%80
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database
https://mangkyu.tistory.com/96