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의 순서에 맞춰서 알아서 정렬된다.
- PK를 통해 클러스터형 인덱스 생성
- 즉, 인덱스 자체가 DB내용과 동일한 것이다.
- 한 테이블당 한개만 생성 가능
- 순서대로 정렬되어 있는 것
- 보조 인덱스(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 |