Mysql 에 index가 있음에도 불구하고 테이블 풀스캔으로 처리되는 대표적인 경우들
1. 컬럼이 가공되는 경우
해당 컬럼이 인덱스에 존재하더라도 쿼리에서 인덱스를 활용하지 못한다.
형변환의 예시의 경우 mysql에서는 묵시적으로 문자열 타입 컬럼에 대해 숫자 타입으로 형변환을 수행한다.
함수 떄문에 인덱스를 못하는 경우 풀어서 where절에 넣어주면 동일한 요건이지만 인덱스를 사용하게 된다.
2. 인덱싱 되지 않은 컬럼을 조건절에 OR연산과 함께 사용하는 경우
joined_at column이 인덱싱에 포함되지 않은 컬럼이었을때 OR연산을 수행시에 account_type이 인덱싱이 되어있더라도 쿼리 실행계획은 인덱스를 타지 못하게 된다.
이후 인덱스에 joined_at column도 추가하면 정상적으로 두 column다 인덱스를 실행하게 된다.
3. 복합 인덱스의 컬럼들 중 선행 컬럼을 조건에서 누락하는 경우
4. Like 연산에서 시작 문자열로 와일드 카드를 사용하는 경우
와일드카드 == %
5. REGEXP 연산 사용
6. 테이블 풀스캔이 인덱스 사용보다 더 효율적인 경우
조건을 만족하는 A,B의 경우가 대부분의 테이블을 차지 한다.
그러니 인덱스를 사용해서 조건에 만족하는 데이터를 찾은 후 다시 실제 데이터 페이지를 읽는것 보다는 바로 테이블 데이터 페이지를 읽으면서 처리하는게 더 효율적이다.
7. Not Equal 조건과 Is not nul 조건은 항상 인덱스를 못 사용하는 것은 아니다.
첫번째는 해당하는 조건이 C,D 이고 얼마 없으므로 인덱스를 타는 것을 확인할 수 있다.
두번째는 A,B에 해당함으로 대부분의 테이블의 row를 차지 함으로 풀스캔이 일어남을 알 수 있다.
'Database > Real MySQL Season1 ,2' 카테고리의 다른 글
17) NoWait & Skip Locked , 18) Union vs Union All (0) | 2024.10.24 |
---|---|
16) Count(*) vs Count(column) (0) | 2024.10.22 |
14) UUID 사용 주의사항 (0) | 2024.10.10 |
13) 콜레이션 (0) | 2024.10.08 |
11) Prepared Statement , 12) SQL 문장의 가독성 향상 (0) | 2024.10.07 |