일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- MongoDB설치 및 환경설정
- 도커예제
- Jenkins
- 도커
- elk
- Springboot+Docker 초기설정
- CleanCode
- mysql
- 북노트
- 자바
- Docker설치
- 알고리즘
- MongoDB
- mysql index
- Expo #SpringBoot #네아로
- 도커실행
- FIRST원칙
- Nginx
- springboot
- Docker기본개념
- 데이터볼륨
- Docker-compose
- MySQL 인덱스
- 프로그래머스
- Jenkins설치
- docker
- Elasticsearch
- git
- F.I.R.S.T
- Jenkins port 변경
- Today
- Total
MEMO
[MySQL] 인덱스란 ? (사용이유) 본문
인덱스란?
MySQL 에서 인덱스는 특정 컬럼 값에 대한 색인(목차) 입니다. 두꺼운 책 가장 앞에 목차를 표기해 두어 독자들이 빠르게 원하는 목차로 찾아갈 수 있도록 하는데 이와 비슷한 개념이 MySQL 의 INDEX 입니다.
테이블의 검색속도는 데이터가 몇개 없으면 상관이 없지만, 데이터가 방대해질수록 속도면이 현저히 떨어지게 됩니다. 이때 미리 데이터들에 목차가 되는 형태의 index 를 설정해두면 검색 속도를 향상시킬 수 있습니다.
예를들어 사용자가 100만명이 있는 테이블에서 userId 가 akdu39zkauebglska 라는 값을 찾고자 한다면, 다음이 쿼리를 사용해야 합니다.
SELECT userId
FROM user_table
WHERE userId = 'akdu39zkauebglska'
인덱스가 없다면 100만개의 데이터를 모두 찾아보고 'akdu39zkauebglska' 값과 매칭되는 결과를 찾아야 합니다. 10개, 100개 정도 되는 데이터의 양이라면 상관 없을 수 있지만 100만개라는 방대한 데이터에서 모든 값들을 하나하나 찾는건 속도에 큰 영향을 미칩니다.
이때, userId 값을 기준으로 index 를 만들어주면 userId가 a, b, c순으로 정렬되어 있기 때문에 aku ~ 부분에서 문자열을 바로 찾을 수 있으며 만약 해당하는 문자열이 없다면 b로 넘어가기 전에 탐색이 종료되기 때문에 문자열이 없다는 결과를 전체탐색보다 빨리 알 수 있습니다.
한 테이블에서 여러개의 index 설정이 가능합니다. 다만, 인덱스가 너무 많으면 새로운 Row 를 추가할 때 마다 인덱스 값또한 추가해주어야 하기 때문에 성능상 이슈가 있을 수 있습니다. 그러기 때문에 한 테이블에 index 는 최대 3 ~ 4 개 정도가 적당합니다.
인덱스 생성/조회/삭제 명령어
1. 생성
1.1 이미 존재하는 테이블에 인덱스 추가하기
CREATE INDEX [INDEX_NAME] ON [TABLE_NAME] ([COLUMN_NAME)];
1.2 테이블 생성시에 인덱스 추가하기
CREATE TABLE [TABLE_NAME] (
....,
INDEX [INDEX_NAME] (COLUMNT_NAME)
);
2. 조회
SHOW INDEX FROM [TABLE_NAME];
3. 삭제
ALTER TABLE [TABLE_NAME] DROP INDEX [INDEX_NAME];
'MySQL' 카테고리의 다른 글
[MySQL] 정규화의 이유 (0) | 2020.06.22 |
---|