개발자 끄적끄적
인덱스 본문
<인덱스>
- 지정한 컬럼들 기준으로 일종의 목차를 생성하는 것이며 데이터 검색 속도 향상을 위해 사용되는 기술이다
<인덱스를 사용하면 좋은 경우>
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 |