📖 인덱스
- 테이블의
칼럼을 색인화
하여 정렬을 통해 검색 속도 향상
시키기 위해 사용
- DBMS는 데이터베이스 테이블의 모든 데이터를 검색하여 원하는 결과를 얻기 위해선 시간이 오래 걸림
- 그래서 칼럼 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만듬
인덱스를 이용하면 항상 좋을까?
- DBMS의 인덱스는 항상 정렬 상태를 유지하기 때문에 원하는 값을
탐색
하는데 빠름
- 하지만 새로운 값을
추가
, 삭제
, 수정
할 경우 쿼리문 실행 속도 느려짐
- 즉, 인덱스는 데이터 저장 성능을 희생하고 대신 데이터 읽기 속도를 높임
인덱스 설정이 없는 테이블의 경우는?
💬 데이터 베이스의 인덱스 자료구조
◾ B+ - Tree 인덱스 알고리즘
- 일반적으로 사용되는 인덱스 알고리즘
- 칼럼의 값을 변형하지 않고(사실 값의 앞부분만 잘라서 관리) 원래 값을 이용해 인덱싱
◾ Hash 인덱스 알고리즘
- 해시 값을 계산해 인덱싱하는 알고리즘
- 매우 빠른 검색 지원
- 하지만 값을 변형해 인덱싱해서 일부만 일치하는 값을 검색하고자 할 때 해시 인덱스 사용 불가
- 주로 메모리 기반 데이터베이스에서 사용
왜 B - Tree를 사용할까
- 데이터 접근 시간복잡도가 O(1)인 해시 테이블이 효율적이여 보이지만, SELECT 질의 조건에 부등호(<>) 연산이 포함
해시 테이블
을 사용하면, 등호(=)연산이 아닌 부등호 연산의 경우 문제 발생
💬 인덱스 성능과 고려사항
모든 칼럼에 인덱싱하면 빨라지는 것인가
- 대답은
NO
- 삽입, 삭제, 갱신 쿼리문 실행 시 별도의 과정 추가
- 삭제의 경우, 삭제하지 않고 사용 안함 표시로 남음
- 즉, row의 수는 그대로
- 이렇게 되면 실제 데이터는 10만건인데 데이터가 100만건 있는 결과를 낳음
- 갱신의 경우는 삭제의 문제점 동시 수반
- 데이터 삭제 후 새 데이터 오는 개념이기 때문
⭐ 즉, 인덱스는 검색을 많이 필요로하는 테이블에 사용하는 것이 좋음