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