개발자 끄적끄적

인덱스 본문

MySQL

인덱스

햏치 2023. 3. 8. 00:36

<인덱스>
- 지정한 컬럼들 기준으로 일종의 목차를 생성하는 것이며 데이터 검색 속도 향상을 위해 사용되는 기술이다

<인덱스를 사용하면 좋은 경우>
1. 데이블 행의 갯수가 많은 경우
2. 인덱스를 적용한 컬럼이 where절에서 많이 사용되는 경우
3. 검색 결과가 원본 테이블 데이터에 비해 적을 경우
4. 해당 컬럼이 null을 포함하는 경우

<인덱스를 사용하면 좋지 않은 경우>
1. 테이블의 행의 갯수가 적음
2. 검색결과가 원본테이블 데이터의 많은 비중
3. 원본 테이블의 insert, delete, update가 빈번할 때


<인덱스 SQL 문법>

1. 인덱스 생성 문법
  1) 단일 인덱스
   CREATE INDEX 인덱스 명 ON TABLE_NAME(컬럼1);
  
  2) 복합 인덱스
   CREATE INDEX 인덱스 명 ON TABLE_NAME(칼럼1, 칼럼2, 칼럼3);

2. 인덱스 조회 문법
   SELECT* FROM USER_INDEXS WHERE TABLE_NAME = 'CUST';

3. 인덱스 삭제 문법
   DROP INDEX 인덱스명;


<인덱스 사용 시 주의 점>
- 해당 컬럼을 가공하지 않거나 연산을 하지 않은 상태에서 비교해야 인덱스를 탄다
  그 이유는 인덱스 컬럼에 변형이 일어나면 WHERE 절에서 비교되기 전에 가공이 먼저 되기 때문이다
  인덱스는 가공되기 전의 값으로 생성 되어있기 때문에 인덱스를 사용할 수 없게 된다


<인텍스를 타지 않는 예>
- LIKE '%문자열%' 로 검색(문자열%(가능))
  - 정렬된 문자열 앞 부분부터 검색을 해야하는데, LIKE 절이 '%' 로 시작되면 앞 문자열을 모르니 인덱스를 사용할 수 없다
  - EXPLAIN SELECT * FROM  employees WHERE first_name LIKE 'DAVID%' (O)
  - EXPLAIN SELECT * FROM employees WHERE first_name LIKE '%DAVID%' (X)
- 부정 연산자(!=, <>, NOT, IN, NOT EXIST)를 사용
- OR 구문을 사용 
  즉, OR 연산자를 사용하면 OR 연산자에 관계된 모든 컬럼이 복합키로 설정되어 있지 않다면 인덱스를 사용하지 않는다
- 컬럼 변형
  즉, 기본 컬럼을 변환한 결과를 조건으로 사용하면 인덱스가 걸리지 않는다

'MySQL' 카테고리의 다른 글

MySQL cmd 관련 명령어  (0) 2023.03.08
트랜잭션, 순위 함수, order by  (0) 2023.03.08
정규화, 반정규화, 클리스터링  (0) 2023.03.08