# Day 24

*인덱스는 데이터베이스 객체 중에 하나이며 테이블 내부에 생성할 수 있다*\
\
\\

## 인덱스

인덱스는 테이블에 붙인 색인을 의미하며 그 역할은 검색속도의 향상이다\
이렇게만 생각해보면 조금 애매할 수 있기 때문에 책의 목차라고 생각하면 이해하기 편하다\
책에서 원하는 내용을 찾고 싶다면 처음부터 끝까지 보면서 원하는 내용을 찾는 것이 아니라\
목차를 보고 원하는 내용이 들어 있는 위치를 찾고 그 위치에서 찾음으로써 효율적으로 검색을 진행하는데,이러한 역할을 맡고 있다\
\
인덱스의 구조는 책의 목차와 비슷하다\
목차에는 제목, 키워드별 페이지가 번호가 적혀있는데, 인덱스에는 검색 시 쓰이는 키워드와 그에 대한 데이터 행의 장소가 저장되어 있다\
\
인덱스는 테이블과는 별개로 독립된 데이터베이스 객체로 작성된다 하지만 인덱스는 단일 객체로 존재하면 될 수 없다\
인덱스는 테이블에 의존하는 객체라고할 수 있으며, 데이터베이스에서 테이블을 삭제하면 인덱스도 함께 삭제된다, 생성은 알아서\
\
\
\\

## 검색에 사용하는 알고리즘

인덱스도 결국은 효율적으로 검색을 진행하는 것이기 때문에 대량의 데이터를 효율적으로 검색하는 방법으로 검색 알고리즘을 사용한다\
인덱스에서 사용되는 검색 알고리즘으로는 이진트리, 그리고 해시가 있다\
\
이진 트리는 데이터 구조 중 하나이고 이진 트리를 사용해서 진행되는 검색이 이진 탐색이라고 한다\
\\

#### 풀 테이블 스캔

인덱스가 지정되지 않은 테이블을 검색할 때는 풀 테이블 스캔이라는 검색 방법을 사용한다\
처리 방법은 테이블에 저장된 모든 값을 처음부터 차례대로 조사해나가는 방법이다\
\\

#### 이진 탐색

이진 탐색이란 처음부터 차례대로 조사해나가는 것이 아니고 집합을 반으로 나눠서 조사하는 방법이다\
\
![img.png](https://1004662897-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWIONvtnbdGZDNTxRR2%2Fuploads%2Fgit-blob-31a12569e2ed8bde2cdcd386b0cf49867ec80b6c%2F24-1.png?alt=media)\
이렇게 30이라는 숫자를 찾기 위해서 대충 5단계를 거치는 것을 볼 수 있는데, 만약 이진 탐색을 사용하지 않고\
풀 스캔을 돌렸다면 15개의 값을 7단계를 거쳐서 값을 찾을 것이다\
물론 2개밖에 차이가 나지는 않지만, 테이블의 행 갯수가 늘어나면 늘어날 수록 차이는 많이 날 것이다\
당연히 대량의 데이터를 검색하는데 있어서 이진 탐색이 아주 빠르다\
\\

이진 트리 -> 이진 탐색은 일단 데이터가 정렬되어 있어야 탐색할 수 있다는 단점이 존재한다\
하지만 테이블의 행을 항시 정렬된 상태로 유지시키는 것은 매우 힘들다\
일단 테이블에 인덱스를 작성하면 테이블의 데이터와는 별개로 인덱스용 데이터가 만들어진다 그리고 이진 트리라는 데이터 구조로 작성됨\
![img\_1.png](https://1004662897-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWIONvtnbdGZDNTxRR2%2Fuploads%2Fgit-blob-31a12569e2ed8bde2cdcd386b0cf49867ec80b6c%2F24-2.png?alt=media)\
트리는 노드라는 요소로 구성되어 있고, 각 노드의 왼쪽에는 노드의 값보다 낮은 것이 들어가고 오른쪽에는 노드의 값보다 높은 것이 들어간다\
일단 가운데 값부터 검색하기 때문에 가장 위에들어가고, 그 왼족에는 처음부터 반까지 중에서 반인 값이 들어가고, 오른쪽에는 반부터 끝까지 중에서 반인 값이 들어감\
그리고 찾고자하는 값이 어디 사이에 있는지 판단해서 내부로 들어가고 그 밑의 노드는 처음의 노드와 같은 기준으로 만들어지게 된다\
\
\
\\

## 유일성

이진 트리를 보다보면 어쩌다 같은 값을 가지는 노드가 여러 개 있는 경우가 있는데, 일단 이진 트리에는 중복되는 값을 가질 수는 없다\
즉, 노드의 가지는 큰 쪽과 작은 쪽으로 나뉘고, 같은 값을 허용하기 위해서는 같은 이라는 제 3의 가지를 가질 필요가 있다\
하지만 이진 트리에서 같은 값을 가지는 노드를 여러 개 만들 수 없다는 특성은 키에 대해서 유일성을 가지게 할 경우에만 유용하다\
그래서 기본키 제약은 이진 트리로 인덱스를 작성하는 데이터베이스가 많다\
그리고 마지막으로 이진트리에서는 중복하는 값을 등록할 수 없다!!\
\
\
\\

\
\
\
\
\
\
\
\
\
\\
