개발자
아래와 같은 SQL을 작성해서 쓰려고 했는데, 인덱싱이 제대로 안먹더라구요. 혹시 sub query 로 만들어진 SQL은 인덱스를 안타나요? 인덱스는 pm, bm 모두 memberId에 걸려있고 추가로 bm.upgradedAt에도 걸려있습니다. 사용하고 있는 DB는 mariaDB 입니다.
답변 1
인기 답변
안녕하세요! 정확한건 EXPLAIN 결과를 보면 알 수 있겠지만, SQL을 읽고 실행 순서를 정하는 DB 엔진 알고리즘에서 sub query는 index를 타지 않는게 더 효율적이라고 판단되면 안 탈 수도 있습니다. 다만, EXPLAIN을 돌려보았을때 만약 derived 같은 키워드가 보인다면 derived table optimization이 잘 돌아갈 수 있는 쿼리인지 확인하시면 좋을 것 같아요. derived table은 보통 임시 결과 값을 저장하는 용도인데, subquery가 어떻게 구성되어 있느냐에 따라서 최적화가 될수도, 안될수도 있습니다. 예를 들면, mariaDB에서는 derived table을 가능하면 상위 오퍼레이션과 머지해서 좀 더 효율적으로 작업을 하려고 하는데 subquery 안에 특정 오퍼레이션이 들어가게되면 절대 상위 오퍼레이션과 머지를 할 수 없는 쿼리가 되어버립니다. ex) subquery안에 GROUP BY, DISTINCT 등이 있으면 머지가 안됨. 참고하시면 좋을 것 같아요 :) - https://mariadb.com/kb/en/derived-table-merge-optimization/ - https://mariadb.com/kb/en/condition-pushdown-into-derived-table-optimization/ (여기 첫 문단에 subquery에 포함되지 말아야할 것들이 있습니다)
익명
작성자
2023년 03월 06일
감사합니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!