MySQL(10)

오늘 한 것

1번 : 9.2.4.2 루스 인덱스 스캔을 이용하는 GROUP BY에서..

SELECT emp_no

FROM salaries

WHERE from_date = '1985-03-01'

GROUP BY emp_no;

위 쿼리는 루스 인덱스 스캔으로 처리 될까 안될까, 정답 된다.

참고 자료

WHERE 조건이 있지만 검색을 위해 인덱스를 사용하지 못하는 경우

GROUP BY 절은 인덱스를 사용할 수 있지만 WHERE 조건절이 인덱스를 사용하지 못할 때는 먼저 GROUP BY를 위해 인덱스를 읽은 후, WHERE 조건의 비교를 위해 데이터 레코드를 읽어야만 한다. 그래서 이 경우는 「루스 인덱스 스캔」을 이용할 수 없으며 「타이트 인덱스 스캔」이나 스캔 과정을 통해 GROUP BY가 처리된다.

WHERE 절의 조건이 있고, 검색을 위해 인덱스를 사용하는 경우

하나의 인덱스가 사용되는 경우인데 「range」 타입의 인덱스 접근 방법에서는 단 하나의 인덱스만 사용할 수 있다. 그래서 WHERE 절의 조건이 인덱스를 사용할 수 있으면 GROUP BY가 인덱스를 사용할 수 있는 조건이 더 까다로워진다. 즉 WHERE 절의 조건과 GROUP BY 처리가 똑같은 인덱스를 공동으로 사용할 수 있을 때만 「루스 인덱스 스캔」을 사용할 수 있다. WHERE 조건절이 인덱스를 사용하는 인덱스와 GROUP BY 절이 사용할 수 있는 인덱스가 다른 경우 일반적으로 옵티마이저는 WHERE 조건절의 인덱스를 사용하도록 실행 계획을 수립하는 경향이 있다. 때로는 전혀 직접 법을 택할 때가 있는데 WHERE 조건이 있더라도 GROUP BY보다는 WHERE 조건이 먼저 인덱스를 사용할 수 있게 실행 계획이 수립된다.

추가 참고자료

https://dev.mysql.com/doc/refman/8.4/en/group-by-optimization.html

해당 내용은 MySQL 8.0 공식 문서의 ‘Loose Index Scan’ 조건 목록 중 네 번째 항목에 있습니다.

Any other parts of the index than those from the GROUP BY referenced in the query must be constants (that is, they must be referenced in equalities with constants), except for the argument of MIN() or MAX() functions.

번역:

쿼리에서 참조되는 GROUP BY 컬럼 이외의 다른 인덱스 부분은 MIN() 또는 MAX() 함수의 인수를 제외하고는 모두 상수여야 합니다 (즉, 상수와의 동등 비교로 참조되어야 합니다). ---

WHERE절의 from_date가 인덱스의 선행 칼럼이 아니라 인덱스를 사용할 수 없어서 WHERE 조건이 있지만 검색을 위해 인덱스를 사용하지 못하는 경우로 판단되어 “루스 인덱스 스캔” 을 이용하지 못하는 것 처럼 보이지만, MySQL 공식 문서에 명시된 규칙, 즉 “쿼리에서 참조되는 GROUP BY 컬럼 이외의 다른 인덱스 부분은 상수와의 동등 비교로 참조되어야 한다”는 조건을 만족하기 때문에 루스 인덱스 스캔으로 취급된다.

results matching ""

    No results matching ""