Database

TIL. 인덱스(INDEX)

MIRACLE LIFE 2023. 2. 9. 13:01

인덱스

인덱스란 원하는 데이터를 빠르게 찾을 수 있도록 특정 컬럼을 복사해서 정렬해둔 컬럼이다.

 

- index가 없는 경우

: 모든 행을 다 뒤짐

 

- index가 있는 경우

: index에서 원하는 데이터를 빠르게 찾음  ->  index와 연결된 원래 테이블의 행을 가져옴

 

 

보통의 인덱스 구조는 트리 형태로 구성

 

- B-tree

: 일반적인 트리의 노드에 데이터를 여러개 넣어둠

  ㄴ 데이터의 양에 따라 한번에 3분의1, 4분의1 씩 검색해야할 데이터의 양을 줄이면서 찾을 수 있음

 

- B+tree

: 리프 노드에만 데이터를 보관하고 나머지 노드에는 가이드만 넣어둠 + 리프 노드끼리 서로 연결함

  ㄴ 범위검색에 이점

 

인덱스가 사용이 안되는 경우

(참조: dbcafe)

 

1. 인덱스 컬럼 절을 변형한 경우

 

> 예시: 컬럼 부분에 함수가 적용되어 있다.

SELECT column_name FROM table_name WHERE TO_CHAR(column_name, 'YYYYMMDD') = '20130909';

> 해결

SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');

2. 내부적으로 데이터 형 변환이 일어난 경우

> 예시: 데이터 타입의 컬럼에 문자('20130909')를 대입 -> 내부적인 형 변환에 의해 컬럼이 함수를 사용한 효과를 나타냄.

SELECT column_name FROM table_name WHERE column_name  = '20130909'; // DATE 타입의 column

> 해결

> SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');

3. 조건절에 NULL 또는 NOT NULL을 사용하는 경우

4. 부정형으로 조건을 사용한 경우

5. LIKE 연산자를 사용한 경우

> 예시: LIKE 연산자를 이용하여 검색을 할 경우 %를 앞에 넣어 사용하게 되면 인덱스를 타지 않음

SELECT column_name FROM table_name WHERE column_name LIKE '%S%';

> 해결

SELECT column_name FROM table_name WHERE column_name LIKE 'S%';

6. OR 조건 사용

'Database' 카테고리의 다른 글

Redis(2)  (0) 2023.06.11
Redis(1)  (0) 2023.06.07
[MongoDB] 데이터베이스 연동하기(2)  (2) 2023.03.13
[MongoDB] 데이터베이스 연동하기(1)  (0) 2023.03.13
SQL VS NoSQL  (0) 2023.02.08