데이터베이스 인덱스와 풀 스캔에 관하여 질문입니다 ㅜㅜ.. 0 11 551

by 모코코디비 [MySQL] [2021.07.23 12:21:37]


제목 없음.png (20,657Bytes)

다음과 같이 사용가능한 인덱스는 있는데 풀스캔을 돌아서 질문입니다..어디가 문제일까요..

explain select
  `a`.`itemname` AS `itemname`,
  `b`.`croppingserino` AS `croppingserino`,
  `b`.`sectCode` AS `sectcode`,
  `b`.`fatrCode` AS `fatrcode`,
  round(avg(`b`.`senVal`), 2) AS `avgSenVal`
from
  
    `itemnumbers` `a`
    join `cropenvinfo` `b` on
      `a`.`itemcode` = `b`.`itemCode`
      and `b`.`itemcode` = '080400'
    
  
group by
  `b`.`croppingserino`,
  `b`.`fatrCode`

사용한 쿼리입니다.

 

 

by 마농 [2021.07.23 13:22:23]

1. b 테이블에 itemcode 를 선두 컬럼으로 하는 인덱스가 없는게 아닐까요?
- b 테이블의 인덱스 구성이 어떻게 되나요?
2. 번외로 그룹바이 구문은 표준에 어긋나는 구문입니다.


by 모코코디비 [2021.07.23 13:48:04]

b테이블의 인덱스는

croppinserino 인덱스 컬럼 croppingserino,

idx_item 인덱스로 컬럼 itemcode 입니다.

그룹바이문은 수정하겠습니다!


by 마농 [2021.07.23 13:52:03]

itemcode 를 선두컬럼으로 하는 b 테이블의 인덱스가 없네요.


by 모코코디비 [2021.07.23 14:00:08]

idx_item 인덱스가 단일로 itemcode 입니다
선두컬럼으로 하는 인덱스는 다른 개념인가요?


by 마농 [2021.07.23 14:18:06]

해당 인덱스가 b 테이블의 인덱스가 맞나요?


by 모코코디비 [2021.07.23 14:27:21]

네 맞습니다 위 조인에서 080400 조건을 제외한다면  인덱스를 타고 ref 스캔으로 변경됩니다.

혹은 조인을 하지 않고 b테이블에서  080400 조건을 걸고 조회하면 위 사진과 같이 인덱스는 타지만 all type 스캔이고

080600 과 같이 다른 케이스를 조건으로 걸면  ref 스캔 진행합니다....


by 모코코디비 [2021.07.23 14:28:22]

확인해보니  and 조건에서 080400 이 아닌 다른 데이터 입력하면 인덱스를 잘 탑니다


by 마농 [2021.07.23 14:49:33]

그러면 080400 자료가 많어서 그럴 수 있습니다.
인덱스 스캔은 소량 스캔에 유리합니다.
다량 스캔시엔 풀스캔이 더 유리할 수 있습니다.


by 모코코디비 [2021.07.23 14:54:16]

감사합니다..b테이블 총 토탈 로우가 약 837만개 가량 됩니다.. 데이터수가 많아서 그런것 같습니다..ㅠ


by 마농 [2021.07.23 15:02:46]

전체 수 보다는 조건을 만족하는 수 및 비중이 중요합니다.
전체 800만건이라고 하더라도 조건을 만족하는 수가 얼마 안된다면 인덱스가 유리합니다.


by 모코코디비 [2021.07.23 15:11:18]

맞아요 조회해보니 080400 의 값이 60% 정도 차지하네요 인덱스를 다시 만들어야겠어요..

답변해주셔서 감사합니다!

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