이론 정리/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 얘는 보조인덱스가 됨