ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [데이터베이스] 인덱스 정리
    개발/데이터베이스 2021. 11. 21. 22:55

    인덱스란


    SQL 명령문의 처리, 테이블에 대한 검색 성능의 속도를 향상시켜주는 자료구조입니다.
    책으로 예를 들었을 때, 첫 페이지부터 한 장씩 넘겨가면서 전체를 확인하며 찾아가는 것 보다 원하는 페이지를 찾아가는 것이 더 빠릅니다. 인덱스는 책 맨 뒤에 있는 색인(인덱스, 찾아보기)에서 해당 단어(테이블)를 찾아 그 페이지로 이동하여 속도면에서 유리하게 해줍니다.

    인덱스의 관리


    DBMS는 index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다. 그렇기 때문에 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 하며 그에 따른 오버헤드가 발생한다.

    - INSERT : 새로운 데이터에 대한 인덱스를 추가한다.
     - DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행한다.
     - UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가한다.

    장단점


    장점
     - 검색 속도가 빨라진다. (조건 검색 Where절, Order by절, MIN,MAX의 효율성이 좋아진다.)
     - 시스템에 걸리는 부하를 줄여서 시스템 전체 성능을 향상시킨다.

    단점
     - 인덱스를 위한 추가적인 공간이 필요하다.
     - 인덱스를 생성하는 데 시간이 걸린다.
     - 데이터의 변경 작업(INSERT/UPDATE/DELETE)이 자주 일어날 경우에는 오히려 성능이 저하된다.


    인덱스가 존재할 때 유리한 경우


    1. 규모가 작지 않은 테이블
    2. INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
    3. JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
    4. 데이터의 중복도가 낮은(분포도가 좋은) 컬럼
    5. '=', 'in' 조건 으로 항상 비교되는 컬럼


    인덱스 사용시 주의 사항


    1. AND 연산자는 각 조건들이 읽어와야 할 ROW 수를 줄이는 역할을 하지만, OR 연산자는 비교해야 할 ROW가 더 늘어나기 떄문에 주의가 필요하다
    2. 인덱스로 사용된 컬럼값 그대로 사용해야만 인덱스가 사용된다.
       - where num * 5 > 10; 는 인덱스가 사용 안되지만, where num > 10 / 5; 는 인덱스를 사용한다.
       - 컬럼이 문자열인데 숫자로 조회하면 타입이 다르기 때문에 인덱스가 사용되지 않는다.
    3. between, like, <. >등 범위 조건은 해당 컬럼은 인덱스를 타지만, 그 뒤 인덱스 컬럼들은 인덱스가 사용되지 않는다.
    4. null 값의 경우, is null 조건으로 인덱스 레인지 스캔이 가능합니다.
    5. 기본키, 유일성 제약이 부여된 열에는 불필요하다.

    댓글

Designed by Tistory.