컴퓨터를 공부하고자 마음먹은지 N일차
[225일차]인덱스 본문
Reference
인덱스
인덱스는 테이블에 붙여진 색인이다.
인덱스의 역할은 검색속도의 향상이다.
즉 SELECT명령에 WHERE 조건에 일치하는 행을 찾는 과정을 최적화시켜주는 것이다.
책 앞의 목차부분을 인덱스라고 생각하면 이해가 빠르겠다.
즉 데이터베이스의 인덱스에도 키워드와 대응하는 데이터 행의 장소가 저장되어 있다.
인덱스의 작성과 삭제
CREATE INDEX 인덱스명 ON 테이블명 (column1, column2, ...)
위와 같은 명령어로 인덱스를 생성할 수 있다.
즉 select쿼리와함께 where구절에 조건을 column1 이나 column2를 달면
해당 칼럼의 검색 성능이 높아진다.
인덱스를 작성 할 때는 저장장치에 색인용 데이터가 따로 만들어진다.
행이 대량으로 존재하면 생성하는데에 시간도 많이 걸리고 저장공간 또한 많이 소비한다.
DROP INDEX 인덱스명 ON 테이블명
테이블을 삭제하면 테이블에 작성했던 인덱스도 자동으로 삭제된다.
인덱스만 삭제할려는 경우에 위와같은 명령어를 사용한다.
B-+tree
RDB에서 사용하는 인덱스는 여러 구조가 있다.
B-tree라던지 비트맵, 해시 인덱스등 세가지로 분류할 수 있는데,
특히 B-tree인덱스는 뛰어난 범용성을 인정받아 가장 많이 사용된다.
트리 자료구조이며 이는 해시자료구조처럼 검색에 월등히 뛰어나지 않지만
대신 모든 기능에 균형잡힌 성능을 가지고 있다는 장점을 가지고있다.
대부분의 데이터베이스에는 트리의 노드에만 키값을 저장한 형태인 B+tree라는
B-tree의 수정된 형태를 채택한다.
Index 의 성능과 고려해야할 사항
검색기능의 성능을 향상시키는 Index는 모든 칼럼에다가 적용시키면 좋은것일까?
결론부터 말하면 그렇지않다. 그렇다면 어떤 지표를 토대로 인덱스를 생상하는것이 좋을까?
카디널리티
카디널리티란 값의 균형을 나타내는 개념이다.
카디널리티가 높다는 것은 모든 레코드에 각각 다른 값이 들어가있다는 것이다.
반대로 카디널리티가 낮다는 것은 모든 레코드에 같은 값이 들어가 있다는 것이다.
column의 값이 true/false, 'Yes'/'No' 와 같이 값의 분포가 별로 없다면,
인덱스로 지정하는 것은 효율적이지 못하다.
선택률
선택률은 특정 필드값을 지정했을 때(ex. where구절로 특정칼럼에 조건을 달았을 때) 테이블 전체에서
몇 개의 레코드가 선택 되는지를 나타내는 개념이다.
100개의 레코드를 가진 테이블의 primary key같은 경우
where절로 조건을 달아 검색했을 시 백개 중 한개의 레코드가 선택될것이다.
따라서 선택률은 1%이다.
따라서 인덱스를 작성하는 조건은 다음과 같은 두 가지 지표로 판단할 수 있다.
첫 번째는 카디널리티가 높을것, 두 번째는 선택률이 낮을것 이다.
여기서 선택률이 만약 10%보다 높다면 테이블 풀 스캔을 하는 편이 더 빠를 가능성이 크다.
'🗄Database' 카테고리의 다른 글
[198일차]물리삭제와 논리삭제 (0) | 2021.03.31 |
---|---|
[131일차]crud방명록 만들기-2 sequelizeORM 리팩토링하기 (0) | 2021.01.23 |