CS

인덱스(INDEX)를 거는 이유

쿠키담임선생님 2022. 12. 15. 10:29

 

1. 인덱스란?


인덱스는 데이터가 위치한 정보를 가진 주소록, 인덱스는 책갈피 같은 역할을 하여 데이터베이스에서 검색을 더 잘 할 수 있게 만들어준다.

 

데이터 베이스에서 원하는 데이터들을 더욱 빨리 출력해줌.

 

2. 인덱스의 원리


데이터베이스의 모든 블록을 다 읽지 않고, 목표 데이터가 있는 영역을 블록지정 후 메모리에 복사하여 작업 진행.

 

3. 인덱스 생성 권장 조건


1. 칼럼에 포함된 값들의 범위가 넓음.

2. 칼럼에 null 이 들어있다.

3. 1개 이상의 칼럼이 where 조건이나 join 조건으로 다른 테이블들과 많이 사용됌.

4. 테이블이 크다.

5. 쿼리가 전체 데이터베이스 규모 중 2%~4% 사이의 범위를 검색 할 때.

 

4. MS-SQL에서 인덱스 확인


인덱스를 확인하는 문법은 다음과 같다.

SP_HELPINDEX '테이블명'

그래서 이를 적용해 보면 이렇다.

이 문장을 F5를 눌러서 실행 해 보면

이렇게 유저 테이블에 있는 인덱스가 나타나고 해당 인덱스에 대한 설명이 나타난다.

 

주의할 점은 인덱스는 SELECT 시해 최고의 성능을 가져가지만, 입력 수정 삭제 시에는 인덱스를 새로 갱신해야 하기 때문에 성능저하가 발생한다. 따라서 삽입 수정 삭제가 별로 없는 테이블에서 사용해야한다. 추가로 조건에서 많이 사용되는 칼럼을 인덱스로 생성하는 것이 좋다.

 

5. 인덱스를 타지 않을 경우(인덱스 사용 시 주의사항) - MS SQL


1. LIKE 검색을 할 때. 우리가 검색 할 때 '%문자%' 이런식으로 검색을 하는데 이를 '문자%' 이렇게 고쳐야한다.

2. NULL 조건으로 인덱스 칼럼을 검색하면 인덱스를 타지 않는다. IS NULL 또는 IN NOT NULL 로 검색을 하면 인덱슥 ㅏ있어도 인덱스를 타지 않는다.

3. 부정연산자 X (!=, <> NOT IN, NOT EXISTS).

4. 형 변화 혹은 값 변환이 있으면 인덱스를 타지 않는다. NUM+1 = 100, ISNULL(NUM,1) = 100 이런 것처럼 조건을 주면 인덱스를 타지 않는다.

5. 인덱스가 걸린 칼럼과 OR 구문으로 연동된 다른 칼럼으로 조회할 경우 테이블 전체 스캔을 하며 인덱스를 타지 않는다.

6. WHERE 로 조건을 걸었을 때 왼쪽 조건만 인덱스를 탄다. 즉 AA.NAMES = BB.NAMES 이런 조건으로 검색하면 AA.NAMES 인덱스를 탄다. 만약 두개의 순서가 바뀌어 BB.NAMES = AA.NAMES 로 하면 AA.NAMES 인덱스를 타지 않는다.

 

6. 인덱스 생성 방법 - MS SQL


인덱스 생성

CREATE INDEX emp_idx01 ON dbo.emp (hiredate)

CREATE INDEX [인덱스명] ON [테이블명] (칼럼, 칼럼, 칼럼...)

 

인덱스 삭제

DROP INDEX emp_inx01 ON dbo.emp

CROP INDEX [인덱스명] ON [테이블명]

 

클러스터형, 비클러스터형 인덱스

/*클러스터형*/
CREATE CLUSTERED INDEX emp_idx02 ON dbo.emp (empno)

/*비클러스터형*/
CREATE NONCLUSTERED INDEX emp_idx03 ON dbo.emp (deptno)
CREATE INDEX emp_idx04 ON dbo.emp (job)

클러스터형 인덱스는 테이블당 하나만 가능. 기본키를 생성하면 클러스터형 인덱스 생성

비클러스터형 인덱스는 데이터행의 주소를 별도의 인덱스 페이지에 저장하며, 테이블에 여러개의 비클러스터형 인덱스를 생성할 수 있다. NONCLUSTERED 키워드를 생략해도 비클러스터생성.

'CS' 카테고리의 다른 글

리눅스 기초 지식 - 커널에 대하여  (0) 2023.12.03
쿠키와 세션  (1) 2023.02.01
Selection Sort 란?(선택정렬)  (0) 2022.12.02
플랫폼이란???  (0) 2022.11.25
컨텍스트 스위칭이란?  (0) 2022.11.25