안녕하세요
select쿼리에서 조회 시 index를 타지 않고 full scan을 타는데 해결방법이 없어서 질문 드립니다.
- DB : mariaDB
- 테이블 : `idx` INT(255) NOT NULL AUTO_INCREMENT COMMENT '인덱스',
id` VARCHAR(20) NOT NULL COMMENT '사번' COLLATE 'utf8mb4_unicode_ci',
code` VARCHAR(20) NOT NULL COMMENT '팀코드' COLLATE 'utf8mb4_unicode_ci',
`create_date` VARCHAR(8) NOT NULL COMMENT '등록 날짜' COLLATE 'utf8mb4_unicode_ci
index 1) PRIMARY KEY : idx
2) idx_date : create_date , id, code
- 현상 및 구현하고 싶은 것
DATA 라는 이름의 테이블에 26만건 정도의 데이터가 있는데
create_date (varchar(8)) 기간에 사번이 작성 데이터를 추출해야하는데 기간을 넓게 주면 full scan
[ 수행 쿼리 ] explain SELECT * FROM data
WHERE _id='111111'
AND (create_date >='20210101' AND create_date <='20210910')
20210701~ 20210910으로 주면 range scan ( explain상 key: idx_coach Using index condition )을
사용하는 것으로 확인.
full scan이 안탈 방법이 있을지 문의 드립니다.ㅠㅠ
( /*use index(idx_date)*/ 같은 강제 index 태우는 것도 넣어봤는데 결과는 동일해서 데이터 타입이 불일치로 인해 index를 타는 것 같은데..ㅠㅠ. create_date='20210101'은 index를 타서. where 절에 varchar 형태의 날짜를 기간을 주려면 어떤식으로 풀어야할지 ....
create_date의 기간을 짧게 설정하면 index range scan이고 길게 설정하면 full scan이라고 하셨는데 index full scan이 아니라 table full scan으로 실행된 것인가요?
table full scan으로 실행되었다면 이는 옵티마이저가 인덱스를 활용한 방법보다 table full scan의 비용이 작다고 판단되어서 실행된 것입니다.
따라서 말씀하신 "where 절에 varchar 형태의 날짜를 기간을 주려면 어떤식으로 풀어야할지" 는 위 현상과는 연관이 없겠습니다.
table full scan으로 실행되지 않게 하려면 인덱스가 잘 활용되어 비용이 적게 들도록 하셔야 합니다.
상황에 따라서는 table full scan을 활용해야 하는 경우도 생길 수 있습니다.