[MySQL] Index 인덱스란?

2024. 12. 30. 03:17·데이터베이스

필요성

cpu나 메모리 등 장치의 성능은 매우 빠른 속도로 발전했지만 디스크 같은 기계식 장치의 성능은 제한적으로 발전했다. 발전해도 여전히 컴퓨터에서 가장 느린 부분이라는 사실에는 변함이 없다.

 

데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건이다.

 

랜덤 I/O 와 순차 I/O

랜덤 I/O는 디스크 드라이브의 플래터(원판)를 돌려 알맞은 위치로 헤더를 이동시킨 후 데이터를 읽는 것을 의미한다.

순차 I/O는 디스크 헤드 이동이 적어 여러 번 쓰기 또는 읽기 요청 시 작업 부하가 훨씬 적다.

 

인덱스 레인지 스캔은 주로 랜덤 I/O를, 풀 테이블 스캔은 순차 I/O를 사용한다. 

 

그래서, 큰 테이블의 대부분의 레코드를 읽는 작업에서는 오히려 인덱스를 사용하지 않고 풀 테이블 스캔을 유도할 때도 있다.

 

인덱스는 조회 성능은 높이지만, (INSERT, UPDATE, DELETE) 성능은 떨어진다. 

 

중복 허용 여부

Unique한 인덱스이냐, 유니크 하지 않냐는 큰 차이를 만든다. 옵티마이저는 유니크 인덱스에서 동등 조건(=)으로 검색하는 것은 항상 1건의 레코드만 찾으면 되므로 더 이상 탐색을 진행하지 않지만, 유니크 하지 않은 인덱스는 더 찾아야 하므로 처리 방식에 차이가 발생한다. 이를 선택도(기수성)이 떨어진다고 한다.

 

선택도가 좋지 않더라도 정렬이나 그루핑같은 작업을 위해 인덱스를 만드는게 훨씬 나은 경우도 많다. 

B-Tree

데이터베이스의 인덱싱 알고리즘 가운데 가장 일반적으로 사용된다.

b-tree 구조

 

리프 노드가 꽉 차면 상위 브랜치 노드까지 처리 범위가 넓어져 b-tree는 상대적으로 쓰기 작업에 비용이 많이 드는 것으로 알려져있다.

 

InnoDB 스토리지 엔진은 인덱스 키 추가 작업을 지연시켜 나중에 처리할 수 있다. 하지만 PK나 UNIQUE 인덱스의 경우 중복 체크가 필요해 즉시 B-TREE에 추가하거나 삭제한다.

 

B-TREE 깊이

인덱스의 B-TREE 깊이가 3인 경우를 가정한다. 키 값이 16바이트인 경우 최대 2억개를, 32바이트로 늘어나면 5천 만개만 담을 수 있다. 인덱스 키 값의 크기는 가능하면 작게 만드는 것이 좋다.

 

 

인덱스 스캔 방식

2024.11.12 - [데이터베이스] - DB 성능 최적화 방법

 

DB 성능 최적화 방법

DB 최적화하는 방법은 여러 가지이지만, 스케일업, 캐싱, sql튜닝, 샤딩 등등이 있고 sql 최적화가 가장 금전적, 시간적 비용이 적다. 시스템 변경 없이 성능 개선이 가능하다.where 조건1 and 조건2 에

maxwithjude.tistory.com

 

전 글에 정리가 되어있다.

 

가용성과 효율성 판단

 

이 조건의 경우 B-TREE 인덱스 특성상 작업 범위 결정 조건으로 사용할 수 없다.

'데이터베이스' 카테고리의 다른 글

[MySQL] DBMS 압축  (0) 2024.12.23
MySQL InnoDB 트랜잭션과 락, 격리 수준  (1) 2024.12.15
InnoDB 스토리지 엔진 아키텍처, MYSQL 로그파일  (0) 2024.12.10
RealMySQL 4장 아키텍쳐 : MySQL 엔진에 대해 알아보자  (2) 2024.12.06
DB 성능 최적화 방법  (1) 2024.11.12
'데이터베이스' 카테고리의 다른 글
  • [MySQL] DBMS 압축
  • MySQL InnoDB 트랜잭션과 락, 격리 수준
  • InnoDB 스토리지 엔진 아키텍처, MYSQL 로그파일
  • RealMySQL 4장 아키텍쳐 : MySQL 엔진에 대해 알아보자
maxwithjude
maxwithjude
maxwithjude 님의 블로그 입니다.
  • maxwithjude
    maxwithjude 님의 블로그
    maxwithjude
  • 전체
    오늘
    어제
    • 분류 전체보기 (29) N
      • 네트워크 (2)
      • 프론트 (2)
      • Devops (7)
      • 데이터베이스 (6)
      • 영어회화 + 자격증 (2)
      • 개발 프로젝트 (9) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    osi 응용계층
    오블완
    innodb
    typeorm
    db 격리수준
    싸피
    티스토리챌린지
    부하테스트
    mysql에러로그
    센드버드
    mysql
    버츄얼 모델 프로젝트
    Docker
    EC2
    오픽후기
    mysql #db #database #성능 최적화
    Sendbird
    vue3
    Vtuber
    오픽주엽
    AWS
    채팅api
    db 압축
    db 락
    vroid studio
    CNCF
    서브모듈
    ssl/tls
    인덱스
    Nest.js
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
maxwithjude
[MySQL] Index 인덱스란?
상단으로

티스토리툴바