인덱스란 무분별한 자료에서 특정 자료들을 효율적으로 검색하기 위해서 검색 기준이 되는 값을 미리 정렬해둔 데이터 구조로 만들어 놓은 것입니다.
이 데이터 구조는 실제 DB와 pointer로 연결되어 실제 튜플을 빠르게 탐색할 수 있습니다.
또한 그래서 빠르게 정렬하거나 그룹핑이 가능합니다.
인덱스는 배열이나 트리 형태로 만들어지며 효율을 위해 B트리나 B+트리로 구현합니다.
B트리는 이진 검색 트리를 발전 시킨 모양으로 노드에 값을 2개 이상 넣어서 구현한 것이고 B+트리는 노드에 검색 가이드를 넣어두고 리프 노드에만 데이터를 넣어두는 구조입니다. 리프 노드끼리 연결되어 넓은 데이터 범위를 검색할 때도 유리하게 사용합니다.
이진 검색 트리는 한 가지 조건에 대해 검색이 편리합니다.
하지만 찾는 조건이 2개 이상이고 조건에 맞는 튜플이 수십만개가 넘게 되면 결국 full scan이 되어 인덱스의 의미가 사라집니다.
따라서 이진 검색 트리의 단점을 해결하기 위해 인덱스를 두 개 이상 설정한 멀티 인덱스 구조인 B트리를 사용하는 것입니다.
인덱스를 미리 만들어두면 메모리를 많이 차지하며 값을 추가, 삭제할 때 인덱스도 같이 수정해야 합니다.
covering index
찾고자 하는 정보가 인덱스에 모두 있는 경우, 즉 ptr로 원본 튜블에 찾아가지 않아도 돼서 조회 속도가 빨라지는 인덱스입니다.
Hash index
hash table 을 사용한 index 구현으로 시간복잡도가 O(1)입니다.
하지만 rehashing에 대한 부담과 equality 비교만 가능하다는 점, range 비교가 불가능한 점, 멀티 인덱스인 경우 전체 attributes에 대한 조회만 가능하다는 단점도 있습니다.
####full scan을 사용하는 경우
조회하려는 데이터가 테이블의 상당 부분을 차지할 때
//테이블을 생성하면서 인덱스를 걸어줌 create table player( id int primary key, // 프라이머리 키는 자동으로 인덱스 생성 name varchar(20) not null, team_id int, //테이블을 생성하면서 name 에 인덱스를 걸어줌 INDEX (player_name_idx->생략가능) (name), //테이블을 생성하면서 team_id와 backnumber에 인덱스를 걸어줌 UNIQUE INDEX (team_id_backnumber_idx) (team_id, backnumber) );
//테이블을 생성하면서 인덱스를 걸어줌 create table player( id int primary key, // 프라이머리 키는 자동으로 인덱스 생성 name varchar(20) not null, team_id int, //테이블을 생성하면서 name 에 인덱스를 걸어줌 INDEX (player_name_idx->생략가능) (name), //테이블을 생성하면서 team_id와 backnumber에 인덱스를 걸어줌 UNIQUE INDEX (team_id_backnumber_idx) (team_id, backnumber) );
//인덱스 검색 show index from table; //인덱스 확인 : 사용 가능한 인덱스와 어떤 인덱스를 사용해서 검색했는지 출력 EXPLAIN select * from player where backnumber = 7;