[교육] SQL 3

버버니야·2022년 3월 29일
0
post-thumbnail

선행 조건의 범위를 줄이는게 Nested Loop에서 중요함

alter table dept add index idx1(dept_nm);
alter table emp add index idx1(dept_cd);
alter table emp add index idx2(emp_nm);
select a.emp_no, a.emp_nm
from emp a
where a.dept_cd ='DDDD'
order by enter_ymd;

위 상황에서는
(dept_cd, enter_ymd) 복합 인덱스를 사용
필터 -> where 절에 잇는 것이 선행되도록 복합인덱스를 사용해야한다.

alter table emp add index idx4(dept_cd, enter_ymd);

아래의 쿼리
select a.emp_no, a.emp_nm
from emp a
where a.dept_cd ='DDDD'
에서도
복합 인덱스(dept_cd, enter_ymd)가 사용될 수 있다.
dpet_cd가 선행컬럼이기 때문에 dept_cd 단일 인덱스와 순서가 같다.

복합인덱스인 idx4가 idx1의 역할을 흡수했기 때문에
이런 경우 idx1을 삭제하는 것이 좋음 불필요한 공간을 차지하기 때문

삭제할 때는 idx4를 무조건 생성 후 idx1을 삭제해야 한다.
실행중인 쿼리가 있어 장애가 발생할 수 있기 때문

4.1 부정형 비교

인덱스가 존재하더라도 부정형 비교가 발생하는 경우 인덱스를 사용할 수 없음.
not -> 긍정으로 바꾸는 방법이 존재하면 하는 편이 좋음
is not null은 인덱스 활용 가능

5.1

EXPAIN and HINT

explain

mysql이 어떻게 쿼리를 실행하는지에 관한 정보를 보여주는 명령어
id : Select Identifier
select_type : SELECT 유형
table : 테이블명 또는 Alias
Partitions : 쿼리결과와 일치하는 레코드의 파티션, 파티션 되지 않는 테이블인 경우 Null
type : JOIN 유형 (Access 유형)
possible_keys : 쿼리 처리를 위해 옵티마이져가 고려한 인덱스 후보
key : 옵티마이저가 실제 선택한 인덱스
Key_len : 선택된 인덱스에서 실제 사용한 인덱스의 길이
ref : 조회를 위해 사용된 상수 또는 컬럼
rows: 쿼리를 수행하기위해 처리해야하는 Row r개수 (옵티마이저의 추정치)
filtered : 조건에 의해 칠터링되는 테이블 row

select type 을 보고 튜닝할 거리를 찾기는 쉽지 않음.

Access type

  • system : 테이블에 오직 하나의 row만 존재흔 ㄴ경우

  • const : 매칭되는 row가 오직 1건, pk/unique key 사용

  • eq_ref : 1대 N을 조인하는데 선행 테이블에서 공급받은 값이 조인되는 테이블에 1개만 존재하는 경우

  • ref : 이전 테이블과 매칭되는 모든 로우를 인덱스를 사용해 Access

  • index : index full scan을 의미. 아주 느린 스캔임

  • ALL : table full scan 더 느린 스캔

Extra

profile
안녕하세요

0개의 댓글