인덱스(Index)
인덱스는 말 그대로 책의 맨 처음 또는 맨 마지막에 있는 색인이라고 할 수 있다. 비유를 그대로 가져와서 인덱스를 살펴본다면 데이터는 책의 내용이고 데이터가 저장된 레코드의 주소는 인덱스 목록에 있는 페이지 번호가 될 것이다. DBMS도 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래걸린다. 그래서 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 두는 것이다. DBMS의 인덱스는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 탐색하는데는 빠르지만 새로운 값을 추가하거나 삭제, 수정하는 경우 쿼리문의 실행 속도가 느려진다. 결론적으로 DBMS에서 인덱스는 데이터의 저장성능을 희생하고 대신 읽기 속도를 높이는 기능이다. |
Composite Index
인덱스로 설정하는 필드의 속성이 중요하다. title, author 순으로 인덱스를 설정한다면 title을 search하는 경우 index의 효과를 볼수있다. 그렇지만 author만으로 search하는 경우 index를 생성한 것이 소용이 없어진다. 따라서 SELECT질의를 어떻게 할 것인가가 인덱스를 어떻게 생성할 것인가에 대해 많은 영향을 끼치게 된다. |
Index 자료구조
B+- Tree Index 알고리즘 일반적으로 사용되는 알고리즘이다. B +- 인덱스는 칼럼의 값을 변형하지 않고(사실은값의 앞부분만 잘라서 관리한다고 한다), 원래의 값을 이용해 인덱싱하는 알고리즘이다. |
Hash 인덱스 알고리즘 칼럼의 값을 해시값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원한다. 그렇지만 값을 변형해서 인덱싱 하므로, 특정문자로 시작하는 값으로 검색하거나, 전방일치, 부등호(<,>)와 같은 내용으로 검색하고자 할때는 해시인덱스를 사용할 수 없다. 동등연산(=)에 특화된 hashtable은 데이터베이스의 자료구조로 적합하지 않다. 주로 메모리 기반의 데이터베이스에서 많이 사용한다. |
Index의 성능과 고려해야할 사항
INDEX는 쿼리의 성능을 향상시킨다고 했는데 그렇다면 모든 칼럼에 INDEX를 생성해두면 어떻게 될것인가? 결론적으로는 빨라지지가 않는다. 1. INDEX를 생성하게 되면 INSERT, DELETE, UPDATE 쿼리문을 실행할때 별도의 과정이 추가적으로 발생한다. INSERT의 경우 INDEX에 대한 데이터도 추가해야 하므로 그만큼 성능손실이 생긴다. DELETE의 경우 INDEX에 존재하는 값은 삭제하지 않고 사용안한다는 표시로 남게된다. 따라서 row의 수는 그대로인데 이러한 작업이 반복되면 실데이터가 10만건인데 데이터가 100만건이 있는 결과가 생길 수 있다. UPDATE의 경우 INSERT, DELETE의 경우의 문제점을 동시에 수반한다. 이전 데이터가 삭제되고 그자리에 새 데이터가 들어오는 개념이기 때문이다. |
칼럼을 이루고 있는 데이터의 형식에 따라서 인덱스의 성능이 악영향을 미칠 수 있다. 즉, 데이터의 형식에 따라 인덱스를 만들면 효율적이고 만들면 비효율적인 데이터의 형식이 존재한다는 것이다. 예를들어 이름, 나이, 성별 세가지 필드를 가지고 있는 테이블이 있다고 해보자. 여기서 성별을 인덱스로 설정한다고 하면 값의 range가 적은 성별은 인덱스를 읽고, 다시 한번 디스크I/O가 발생하기 때문에 그만큼 비효율적이게 된다.(나이또한 마찬가지) |
출처 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database
'이론공부 > 데이터베이스' 카테고리의 다른 글
트랜잭션이란 무엇인가? (0) | 2020.08.15 |
---|
댓글