인덱스 (index)

2022. 11. 30. 07:50몰랐던거/DB

<목차>

1. 인덱스란?

< 인덱스 개념 >

< 인덱스 장단점 >

< 인덱스를 사용하기 위한 컬럼 선정 기준 >

2. 인덱스 종류

< 클러스터 인덱스 >

< 비클러스터 인덱스 >

3. 인덱스 생성 및 사용하기

< 인덱스 생성방법 >

< 조회 시 인덱스를 이용하기 위한 주의사항 >


1. 인덱스란?

< 인덱스의 개념 >

추가적인 쓰기 작업과 저장 공간을 활용하여 테이블 조회 속도를 향상시키기 위한 자료구조이다.

위와 같이 책 맨 앞이나 맨 뒤에 있는 색인처럼 모든 데이터를 조회하지 않게끔 데이터와 데이터의 위치를 포함한 자료구조를 만들어서 조회 속도를 향상시킨다.

< 인덱스 장단점 >

  • 장점
    • 테이블 조회 속도 향상 (WHERE, ORDER BY, JOIN)
    • 빠른 조회 응답 속도를 통한 전반적 시스템 부하 감소
  • 단점
    • 인덱스 관리를 위해 DB의 약 10%에 해당하는 저장 공간 필요
    • 인덱스 관리를 위한 추가 작업 필요 (DML 시 인덱스 갱신 필요)
    • 인덱스 잘못 사용 시 오히려 성능 저하 ( 인덱스 비대 → 성능저하 )

⇒ 인덱스는 메모리를 차지 → 사용하지 않는 인덱스들은 주기적으로 삭제해야함.

< 인덱스를 사용하기 위한 컬럼 선정 기준 >

💡
한 테이블 당 보통 3~5개 정도가 적당 → 테이블 목적, 크기에 따라 달라짐. 어떤 컬럼을 이용하여 인덱스를 생성하면 좋을까?

  1. 카디널리티 (Cardinality)

    카디널리티 : 유니크한 정도

    ⇒ 카디널리티 높음 → 인덱스 설정하기 좋은 컬럼

  1. 선택도 (Selectivity)

    선택도 : WHERE 절 이용 → 반환되는 레코드 수

    ⇒ 선택도 낮음 → 인덱스 설정하기 좋은 컬럼

  1. 활용도

    활용도 : WHERE 절에서 이용되는 정도 (자주 이용 되는 지)

    ⇒ 활용도 높음 → 인덱스 설정하기 좋은 컬럼

  1. 중복도

    중복도 : 해당 컬럼으로 생성한 인덱스의 수

    ⇒ 중복도 낮음 → 인덱스 설정하기 좋은 컬럼


2. 인덱스 종류

< 클러스터 인덱스 >

  • PK 속성을 설정 → 자동으로 생성
  • 테이블 당 1개만 허용
  • 물리적 정렬 → 테이블 자체를 정렬
  • 데이터 추가, 수정, 삭제 시 항상 정렬 상태 유지.

[ 아래 그림, T1을 Primary Key로 설정한 모습 → 정렬 O ]

< 비클러스터 인덱스 >

  • UK, FK에 의해서 DB by DB로 자동 생성, CREATE INDEX로 직접 등록
  • 테이블 당 여러 개의 인덱스 등록 가능
  • 리프 페이지 이용 → 클러스터형 보다 조회 느림
  • 레코드 원본 정렬 X → 클러스터형 보다 추가, 수정, 삭제 빠름.

[ 아래 그림, T1으로 비클러스터형 인덱스를 생성한 모습 → 정렬 X ]


3. 인덱스 생성 및 사용하기

< 인덱스 생성방법 >

CREATE INDEX <index_name>
ON <table_name> (column1, column2, ...)


# 단일 컬럼
CREATE INDEX customers_by_phone
ON customers (phone_number)

# 다중 컬럼
CREATE INDEX customers_by_phone
ON customers (phone_number, age, address)

다중 컬럼을 이용한 인덱스 생성 → 카디널리티가 높은 컬럼 순으로 인덱스 생성

쿼리 성능이 높아짐.

< 조회 시 인덱스를 사용하기 위한 주의 사항 >

💡
조회 시 WHERE 절에 인덱스 컬럼을 포함 시키면 인덱스를 타고 조회 하지만, 인덱스를 타지 않는 경우도 존재 → 주의 사항을 알아보자.

  1. between, >, <, like 등의 범위 조건 → 지양하기
    • (phone_number, age, address) WHERE phone_number = X AND age > 10 AND address = Y
    • age 보다 순서가 뒤인 address 인덱스를 사용하지 않음.
  1. 반대로 =, in은 다음 컬럼도 인덱스를 사용한다.
  1. OR 연산자 → 비교해야할 ROW 갯수 증가 → Full Scan이 발생할 확률이 높음.
  1. 컬럼 값 가공 → 인덱스 사용 X
    • WHERE age * 10 > 100 인덱스 사용 X
    • WHERE age > 100 / 10 인덱스 사용 O
  1. IS NULL 조건 → 인덱스 사용 O
  1. 다중 컬럼 인덱스 → 첫번째 컬럼 무조건 포함
    • (phone_number, age, address)
      • WHERE age = 10 AND address = X 인덱스 사용 X
      • WHERE age = 10 AND phone_number = X 인덱스 사용 O

⇒ 추가적인 정보

[mysql] 인덱스 정리 및 팁
MySQL 인덱스에 관해 정리를 하였습니다. MySQL을 잘 알아서 정리를 한것이 아니라, 잘 알고 싶어서 정리한 것이라 오류가 있을수도 있습니다. 1. 인덱스란? 인덱스 == 정렬 인덱스는 결국 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것입니다. insert, update, delete (Command)의 성능을 희생하고 대신 select (Query)의 성능을 향상시킵니다.
https://jojoldu.tistory.com/243

Reference

MySQL - INDEX 정리
MySQL의 INDEX 관련 공부를 하던 중 '이것이 MySQL이다' 라는 책에 대한 강의가 유튜브에 올라온것을 보고 참고하였다. DB에서 데이터를 가져오는데 많은 시간이 걸리기 때문에 백엔드에서 데이터베이스 튜닝은 매우 중요하다. 그중에서 많은 비중을 차지하는 INDEX에 대해 정리하였다.
https://dev-navill.tistory.com/26
[Database] 인덱스(index)란?
1. 인덱스(Index)란? [ 인덱스(index)란? ] 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지를 찾아 보는것은 오랜 시간이 걸린다. 그렇기 때문에 책의 저자들은 책의 맨 앞 또는 맨 뒤에 색인을 추가하는데, 데이터베이스의 index는 책의 색인과 같다.
https://mangkyu.tistory.com/96
https://yurimkoo.github.io/db/2020/03/14/db-index.html
[DB] 인덱스(Index) 사용 예시 (생성, 조회, 삭제, 리빌드)
들어가면서.. 인덱스를 사용하는 방법을 알아보려 한다. 예전에 실습용으로 잠깐 만들어 두었던 B 테이블을 가지고 간단한 예제를 진행해 보려고 한다. 인덱스(Index) 사용 예시 ① 인덱스 생성 --문법 CREATE INDEX [인덱스명] ON [테이블명](컬럼1, 컬럼2, 컬럼3.......) --예제 1) 기본 CREATE INDEX EX_INDEX ON B(B_NO, B_TITLE); --예제 2) 컬럼 값 중복 허용 x 인 인덱스 생성 CREATE[UNIQUE] INDEX EX_INDEX ON B(B_NO, B_TITLE); 위와 같이 쿼리문을 작성하면 INDEX를 생성할 수 있다.
https://choicode.tistory.com/28#:~:text=%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%8A%94%20%EC%A1%B0%ED%9A%8C%20%EC%84%B1%EB%8A%A5
인덱스, 쿼리 속도를 향상시키는 개체 : 개념과 사용하는 이유
관련 포스팅 목차 1. 개념과 사용하는 이유 2. 인덱스 구조와 인덱스 리빌드 3. 인덱스 SQL 문법 4. 인덱스 사용 전략 5. 인덱스를 사용한 SQL 튜닝 방법 포스팅 내용 인덱스 개념 인덱스를 사용하는 이유 인덱스 사용은 항상 성능을 향상시키는 것은 아니다. 인덱스 종류 : Clustered Index와 Non-Clustered Index 이번 포스팅은 쿼리 조회 속도를 향상시키는 개체인 인덱스에 대해 알아보고자 한다.
https://shin-bugkiller.tistory.com/42
[데이터베이스] 클러스터 인덱스와 넌클러스터 인덱스/ 개념 총정리
오늘은 인덱스의 종류인 클러스터 인덱스, 넌 클러스터 인덱스에 대해 정리해보겠습니다. 일단 인덱스란 데이터를 빠르게 검색할 수 있게 해주는 객체입니다. 컬럼을 정렬한 후에 데이터를 빠르게 찾을 수 있도록 도와주는 역할을 합니다. 책으로 비유하자면 색인을 의미합니다. 인덱스를 생성하면 무조건 데이터를 빠르게 검색할 수 있을까요? 대답은 노! 그건 아닙니다. 인덱스를 무작정 생성한다고 좋은 방법은 아닙니다.
https://junghn.tistory.com/entry/DB-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EC%99%80-%EB%84%8C%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B0%9C%EB%85%90-%EC%B4%9D%EC%A0%95%EB%A6%AC
[mysql] 인덱스 정리 및 팁
MySQL 인덱스에 관해 정리를 하였습니다. MySQL을 잘 알아서 정리를 한것이 아니라, 잘 알고 싶어서 정리한 것이라 오류가 있을수도 있습니다. 1. 인덱스란? 인덱스 == 정렬 인덱스는 결국 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것입니다. insert, update, delete (Command)의 성능을 희생하고 대신 select (Query)의 성능을 향상시킵니다.
https://jojoldu.tistory.com/243

Uploaded by N2T

'몰랐던거 > DB' 카테고리의 다른 글

[Transaction] 트랜잭션과 트랜잭션 격리성 공부하기  (2) 2023.04.11
[Lock] DB 락에 대해서 공부하기  (0) 2023.04.11
DBMS의 종류, DB 서버  (0) 2022.08.31
데이터베이스의 개념  (0) 2022.08.31
DDL, DML, DCL 이란?  (0) 2022.08.25