이론 정리/Database

MySql 인덱스 - 기본 개념

철매존 2023. 5. 9. 23:07
728x90

MySQL 인덱스

실무에서 엄청나게 중요한녀석임...
이를 사용해서 select를 할 때에 데이터를 빠르게 응답하도록 할 수 있음!

사실 인덱스를 한다고 뭐 쿼리가 바뀌는건 아니다.
그냥 이걸 통해 속도를 빠르게 하는거임.

데이터베이스를 빠르게 하도록 하는 "튜닝" 에서 가장 핵심적인 것이 인덱스이다.

물론 막 쓰면 오히려 성능을 떨어뜨릴 수도 있다.
그래서 일단 인덱스의 개념이랑 활용 등을 찾아보도록 한다.

인덱스 개념

예를 들어 데이터베이스에

  • 사람
    • 이름
    • 몸무게

을 갖는 테이블이 있을 때

  • 1
    • 류찬
    • 178
    • 70
  • 2
    • 김찬
    • 189
    • 99
  • 3
    • 박찬
    • 140
    • 39
  • 4
    • 이찬
    • 180
    • 34
  • 5
    • 반찬
    • 200
    • 50
  • 6
    • 징기스찬
    • 160
    • 50
  • 7
    • 가슴이벅찬
    • 390
    • 34

요런 식으로 있다고 하자. (일단 동명이인은 없다고 가정한다.)
여기서 만약 7번에 있는 가슴이벅찬 이라는 사람을 찾으려고 한다면 기존 select를 사용하는 경우
1 -> 2 -> 3 -> ... -> 7
이 순서로 찾아갈 것이다.

그런데 만약 가나다 순서로 배열한다면?
7번 가슴이벅찬은 맨 앞에 위치할 것이다.

그래서 만약에 저걸 가나다순서로 이름-위치 로 저장하면

  • 가슴이벅찬 : 7번
  • 김찬 : 2번
  • 류찬 : 1번

이렇게 적용될 것이고 이제 찾을 때에 가장 앞에 있는 가슴이벅찬 -> 7번 을 알고 바로 7번 데이터를 찾아갈 수 있을 것이다.

이것이 바로 인덱스의 개념이다.

장/단점

위 개념에서 알아볼 수 있는 장/단점을 찾아보자.

  • 장점
    • 위에서 보면 알다시피, 미리 잘 세팅되어 있는 인덱스를 찾아간다면 적절하게 원하는 데이터를 찾아갈 수 있다.
  • 단점
    • 근데 저거를 어떻게 세팅해야 할까?
      • 만약에 순서를 키순서 로 하게되면 오히려 가장 나중에 찾게 될수도 있다.
        • 그렇다고 키순서라는 인덱싱을 만들어 놓고 쓸일 없어서 안쓰게 되면 그냥 공간낭비가 된다.
          • 인덱스는 통상 데이터베이스 크기의 10%정도라고 한다.
    • 인덱스를 만드는 데에도 추가적인 시간이 소요된다.
      • CUD가 많은 경우는 오히려 성능이 나빠질 수도 있다.
      • 인덱스 최초 생성에도 시간이 많이 들어간다.

인덱스의 종류

  • 클러스터형 인덱스(Clustered Index)
    • 순서대로 정렬되어 있는 것
      • 즉, 인덱스 자체가 DB내용과 동일한 것이다.
        • PK를 통해 클러스터형 인덱스 생성
          • 그리고 이 PK의 순서에 맞춰서 알아서 정렬된다.
    • 한 테이블당 한개만 생성 가능
  • 보조 인덱스(Secondary Index)
    • 원하는 방법으로 추가 정렬을 한 것
      • 위의 가나다 순 등등이 이에 해당한다.
        • UK를 통해 보조 인덱스 생성
    • 한 테이블당 여러개 생성 가능
    • 딱히 정렬되지 않아도 괜찮다.

여기서 중요한것은 클러스터형 인덱스는 반드시 있을 필요는 없다는 것이다.
그리고 PK가 없는 경우 UK+NotNull이면 클러스터형 인덱스가 된다. -> PK가 있는 경우는 그게 클러스터형 인덱스가 되는거임 -> 이경우는 UH+NotNull 얘는 보조인덱스가 됨

'이론 정리 > Database' 카테고리의 다른 글

MySQL 페이징 해보자(feat offset, infinite scroll)  (0) 2023.10.02
select for update에 대해서(feat deadlock, gaplock)  (2) 2023.06.11
Mysql 엔진 Lock  (0) 2023.05.01
캐시 전략  (1) 2023.01.16
shared lock, exclusive lock  (0) 2023.01.05