일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- @RequestBody
- TypeScript
- JavaScript
- Java
- 프로젝트 여러 개
- DART
- flutter mac 설치
- class-transformer
- Mac
- Spring
- InteliJ
- SQL
- Aspect
- 코어자바스크립트
- tecoble
- datagrip 한글깨짐
- node.js
- svn
- REST
- db
- javascript error
- 인텔리제이
- maven
- Stream
- MySQL
- 봤어요처리
- oracle
- ojdbc6
- eqauls-hashcode
- 프로그래머스
- Today
- Total
개발자가 되고 싶은 개발자
[DATABASE] INDEX 본문
인덱스란?
- 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다.
- 책을 볼 때 특정 내용을 빨리 찾기 위해 있는 맨 뒷 부분의 찾아보기 부분이 인덱스라고 생각하면 된다.
- 인덱스는 테이블에 있는 한 개 이상의 컬럼으로 만들 수 있다.
- 만약 인덱스가 없다면 테이블 전체를 뒤지는 풀 스캔을 하게 된다.
B-tree 인덱스
- 여러 종류의 인덱스가 있는데 가장 일반적인 인덱스가 B-tree인덱스이다.
- 표준인 B-tree인덱스는 인덱스 키와 이 키에 해당하는 컬럼 값을 가진 테이블의 로우가 저장된 주소 값으로 구성된다.
- 인덱스 키: 인덱스로 만들 테이블의 컬럼 값
고려사항
- 입력, 수정, 삭제를 하게 되면 인덱스를 새로 갱신하여야 하기 때문에 성능이 저하된다.
- 조건절에서 많이 사용되는 컬럼을 인덱스로 사용하는 것이 좋다.
- 동일한 데이터가 적은 컬럼 혹은 JOIN을 할 때 사용되는 컬럼을 인덱스로 사용하는 것이 좋다.
- 인덱스가 존재하는 컬럼인데 인덱스를 타지 않는 경우가 있다. 이런 경우를 정리하여 사용할 때 주의하여야 한다.
인덱스 생성(MSSQL, ORACLE)
-- MSSQL
CREATE 클러스터옵션 INDEX 인덱스명 ON 테이블명(정렬컬럼명 정렬기준);
ex.) CREATE INDEX TestIndex ON TestTable(col);
-- ORACLE
CREATE[UNIQUE] INDEX 인덱스명 ON 테이블명(컬럼);
ex.) CREATE UNIQUE INDEX ex2_10_ix01 ON ex4210(col1);
인덱스 조회(MSSQL, ORACLE)
-- MSSQL
SP_HELPINDEX '테이블명';
-- ORACLE
SELECT index_name table_name FROM user_indexes WHERE table_name = 'EX2_10';
인덱스 삭제(MSSQL, ORACLE)
-- MSSQL
DROP INDEX 테이블명.인덱스명;
-- ORACLE
DROP INDEX 인덱스명;
Knowhow(인덱스와 성능에 관한 고찰)
- 오라클 SQL과 PL/SQL을 다루는 기술 저자의 말을 인용
- "성능 문제가 발생하면 누구나 제일 처음 생각해내는 해결책이 인덱스 추가 생성이다. SI단계에서 향후 성능까지 고려해 개발하는 것은 현실적으로 쉽지 않으며, 추가적인 인덱스 생성이 필요한 것이 사실이다. 그래서 새로운 인덱스를 추가로 만드는 것이 보통이지만, 이렇게 처리하면 당장의 문제는 해결될 수 있지만(꼭 해결된다고 장담할 수는 없다.), 또 다시 다른 SQL문에서 느려지는 현상이 발생한다. 그럼 또 새 인덱스를 만들어야 할까? 앞서 말했듯이 인덱스를 많이 만드는 것은 다른 성능 부하를 초래한다. 그렇다면 어떻게 해야할까?"
- "이럴 때는 이렇게 하라 라는 정답이 존재하는 건 아니다. (중략)"
- 필자가 말하는 성능 문제 해결 5원칙
1. 어떤 컬럼을 인덱스로 만들 것인지, 인덱스는 몇 개나 만들 것인지(최대 5개를 넘어가지 않도록 한다) 결정한다.
2. 효율적인 SQL문을 제대로 작성한다.
3. 효율적인 SQL문을 제대로 작성한다.
4. 효율적인 SQL문을 제대로 작성한다.
5. 효율적인 SQL문을 제대로 작성한다.
회고
- 업무 중 테이블에 인덱스를 잡으라고 하셨다. 실제 인덱스를 생성해 본 적이 없어서 정리해보았다. 아직 성능 상의 이슈도 없고 향후 쌓일 데이터의 양을 생각해봤을 때, 미리 전부 인덱스를 잡아두는 것이 오히려 성능상의 이슈를 일으키지 않을까라는 생각이 들었다.
- 공부 후의 생각을 말씀드리고 진행하기로.
출처
'Dev > DataBase' 카테고리의 다른 글
Connection Pool의 min 값이 프로세스 종료를 방해했던 이슈 정리 (0) | 2024.02.07 |
---|---|
DBMS의 스케줄러 vs 스케줄러 서버 구성 (1) | 2023.03.13 |
[SQL] SQL Join 간단 설명 (0) | 2020.12.22 |
[SQL] Subquery error (0) | 2020.10.29 |
[Mybatis] If문 Null 처리 (0) | 2020.10.26 |