쿼리 index 문의 0 3 569

by 비비도 [SQL Query] [2021.10.07 19:56:31]


안녕하세요

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 형태의 날짜를 기간을 주려면 어떤식으로 풀어야할지 .... 

 

 

  

 

 

by 마농 [2021.10.08 07:26:21]

인덱스 타는 것으로 보이는데요?


by 축구쟁이 [2021.10.08 14:43:29]

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을 활용해야 하는 경우도 생길 수 있습니다.


by 마농 [2021.10.08 15:18:50]

이퀄조건인 ID 항목이 범위조건인 날짜 항목보다 인덱스 위치가 뒤쪽이네요.
이 경우 효율적인 인덱스 활용이 안됩니다.
기존 인덱스 순서를 조정하거나 새로운 인덱스 를 추가하거나 할 수 있습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입