MySQL/혼공SQL

15강. 인덱스의 개념과 장단점, 클러스터형 인덱스와 보조 인덱스

묘걍 2023. 11. 29. 19:33

06-1. 인덱스 개념을 파악하자

👉🏻 인덱스의 개념

- 책의 찾아보기

     - 책에 '찾아보기'가 없다면 원하는 글자를 찾기 위해 책의 1페이지부터 쭉 찾아야 한다

     - 찾아보기가 있으면 해당 글자가 있는 페이지로 바로 갈 수 있다.

- 인덱스는 반드시 필요한 건 아니다

- 현실적으로 실무에서 인덱스 없이 데이터를 사용하기 힘들다

     - 현실에서 데이터가 정말 많기 때문에 컴퓨터가 아무리 빨라도 인덱스 없이 모두 뒤지는 것은 한계가 있다

🧩 인덱스의 문제점

- 인덱스를 '무조건'쓰는 건 좋은 게 아닐 수 있다

출처: 혼공SQL유튜브

- 비유하자면 비타민을 매일 한 알씩 복용하는 것은 몸을 건강하게 만들어주지만

  좋다고 해서 과다 복용할 경우 문제가 생길 수 있다

- 즉, 인덱스는 적절히 사용할 때는 도움이 되지만

  인덱스에 대한 이해 없이 과하게 사용할 경우 오히려 더 느려지거나 문제가 생길 수 있다

출처: 혼공SQL 유튜브

예를 들어 SELECT를 찾아보기에 등록한다면, SELECT가 책 내에서 여러번 나오기 때문에 찾아보기에 여러개가 등록 된다. 이렇게 되면 찾아보기에서 페이지수를 확인하고 해당 페이지에서 SELECT를 확인하고, 아니라면 다시 찾아보기 페이지로 와서 페이지 수를 확인하고 해당 페이지에서 SELECT를 확인하고... 의 과정을 반복해야한다. 이럴 경우 차라리 앞에서부터 쭉 찾아가는 것이 나을 수도 있다.

이처럼 인덱스를 만든다고 무조건 좋은 게 아니다. 많이 나오는 것은 안 만드는 게 도움이 된다

👉🏻 인덱스의 장점과 단점

🧩 장점

  • SELECT문의 검색 속도가 빨라진다
  • 그 결과 전반적인 시스템의 성능이 향상된다
    • DB 서버를 나 혼자 쓰는 게 아니라 동시에 여러명이 사용한다. 한명의 처리가 빨라지니 다른 사람의 처리도 빨라져 결과적으로 전체 시스템 성능이 향상되는 것

🧩 단점

  • 공간을 차지한다
    • 10% ~  20% 정도
  • 처음 만드는 데 시간이 오래 걸린다
    • 책의 찾아보기가 없는 경우 책 전체를 스캔한 뒤 만들어야하는 것 처럼
    • 인덱스를 만들어두고 시작하는 것이 좋다

👉🏻 인덱스의 종류

출처: 혼공SQL 유튜브

🧩 클러스터형 인덱스

  • 영어사전, 국어사전에 비유됨
    • 알파벳 순으로 정렬 및 인덱스

🧩 보조 인덱스

  • 책 뒤의 찾아보기에 비유됨
    • 책 내용 있고 인덱스가 뒤에 따로 있음

👉🏻 자동으로 생성되는 인덱스

- 자동으로 인덱스가 생성될 때 클러스터 아니면 보조 둘 중 하나가 생성된다는 것

🧩 Primary key

  • PK로 지정한 열에 자동으로 클러스터형 인덱스가 생성됨
    • 'TWC', 'BLK', 'WMN' ... 순으로 입력해도 SELECT해보면 아이디 알파벳 순으로 나열됨

🎮 market_db에서 확인해보기

market_db 초기화 시키기

- mem_id가 PRIMARY KEY로 지정돼있음

member의 결과를 확인해보면

- mem_id가 알파벳 순으로 정렬되어 있다

- 입력을 순서대로 하지 않아음에도 자동으로 알파벳 순으로 정렬됨

🎮 손코딩

- market_db 사용하기

- 테이블1 만들기

- col1을 기본키로

- 테이블에 만들어진 인덱스를 확인할 수 있다

  • Table: 테이블명
  • Non_unique: 유니크하지 않다 → 0(중복 불가) / 1(중복 가능)
    • primary key는 중복 불가니까 0
  • Key_name
    • primary라고 써 있으면 클러스터형 인덱스다
  • Column_name: 적용된 컬럼 명

- Primary key는 테이블 당 한 개만

- Unique는 테이블에 여러개 가능

- 다 중복 불가다

  • Key_name
    • col2, col3 = 보조 인덱스

- 자동으로 생성되는 인덱스는

   PRIMARY KEY로 지정하면 클러스터형 인덱스가 생성되고

   UNIQUE로 지정하면 보조 인덱스가 생성된다

- 클러스터형 인덱스는 테이블에 하나만 (PK처럼)

   보조 인덱스는 테이블에 여러개 만들 수 있다 (UNIQUE처럼)

🧩 클러스터형 인덱스

- 자동으로 정렬되는 클러스터형 인덱스

- 영어 사전

출처: 혼공SQL 유튜브

모르는 영어 단어 필기한 노트. 알파벳 순이 아니다. 이것은 인덱스가 없이 테이블에 데이터를 INSERT 시킨 것과 같다. 

여기에 인덱스를 만든다. 영어 단어를 PK로 지정하거나 영어 단어를 클러스터형 인덱스로 지정하는 순간 영어사전이 된다. 즉, 단어가 알파벳 순으로 정렬이 된다.

여기서 인덱스가 있든 없든 내용 자체는 바뀌지 않는다. 인덱스가 있을 경우 순서가 바뀔 뿐

🎮 손코딩

- 테이블을 삭제

- 회원 테이블 새로 만들기

- 키를 하나도 지정하지 않음 (인덱스가 없음)

     = 넣는대로 INSERT 하겠다

- 위와 같은 순서로 입력함

- SELECT 해보면 입력한 순서대로 나온다

- 인덱스 없이 입력한 그대로 나옴

🎮 mem_id를 Primary Key로 지정해보기

- Primary key 지정 위해 테이블 수정

- 이번엔 알파벳 순으로 정렬이 된다.

* 클러스터형 인덱스는 지정한 열이 영어사전처럼 정렬이 된다

* 클러스터형 인덱스는 테이블에 하나만 지정이 가능하다

     - 영어 사전의 경우 영어 단어로도 정렬되고 동시에 뜻으로도 정렬된다? 말이 안됨

🎮 회원명에 PRIMARY KEY 지정

- 원래 설정돼있던 기본키를 제거하고

- 테이블 수정을 통해 회원명에 PRIMARY KEY 지정

- PRIMARY KEY가 비어있으니 성공

- 팀 이름이 가나다 순으로 정렬되었다

🎮 소녀시대 입력해보기

- 소녀시대를 입력하면 그냥 입력된 순서대로 맨 뒤로 가는 게 아니라, 소녀시대 가나다 순서에 맞게 정렬됨

 

* 인덱스가 있던 없던 내용적인 측면은 바뀌지 않는다! 차례만 바뀐다!

 

🧩 보조 인덱스

  • UNIQUE KEY(고유키)로 지정하면 보조 인덱스가 생성된다
  • 책 뒤의 찾아보기

출처: 혼공SQL유튜브

- 이런 책에서 책 자체의 내용이 정렬되면 안됨. 책의 내용은 유지되면서 책 뒤에 찾아보기를 만들어야 함

- 찾아보기는 가나다순

🎮 다시 키 없이 데이터 입력해보기

- 원래 있던 테이블을 지우고 테이블을 새로 만든다

- 위와 같은 순서로 데이터를 입력하면

- 역시나 입력한 순서대로 들어간다

- 테이블 수정을 통해 mem_id를 고유키로 만들기

- 똑같다

- 내용이 안 바뀌었기 때문에, 책 뒤의 찾아보기를 만든 것

출처: 혼공SQL유튜브

- UNIQUE KEY는 여러개 지정할 수 있다

- 동물에 대한 찾아보기는 두고 식물에 대한 찾아보기를 추가하면 됨

🎮 mem_name을 추가로 UNIQUE키 설정하기

- 순서가 안 바뀐다!!!

- 내용이 바뀌는 게 아니라 찾아보기가 추가되는거니까!

- 보조 인덱스가 만들어진 상태

🎮 새로운 데이터 추가해보기

- 맨 뒤에 추가됨

- 책에 내용 추가할 때는 중간에 추가하는 게 아니라 책의 맨 뒤에 추가되는 식

     - 찾아보기에만 추가해주기

 

 

 

 

 

 

 

 

 

 

 

출처: https://youtu.be/KZmW6VaY5BU?si=OTAvA4ZUtfTfafoX