인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

박철현님의 프로필 이미지

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

게시글 목록 API - 페이지 번호 - N번 페이지 M개 게시글 - 설계

24:49초 Explain 쿼리 문에서 질문드립니다

작성

·

158

·

수정됨

0

  • 학습 관련 질문을 최대한 상세히 남겨주세요!

  • 고민 과정도 같이 나열해주셔도 좋습니다.

  • 먼저 유사한 질문이 있었는지 검색해보세요.

  • 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

    저는 왜 Using where과 Using Index 두개가 같이 나올까요?

    오로지 Using Index만 나와야 커버링 인덱스를 이용해서 데이터를 성공적으로 조회했다 라고 이해했는데 Using where와 같이 나온거 보면 뭔가 MySQL 내부에서 커버링 인덱스만으로 데이터를 조회하지 못했으니 뭔가를 더 실행한 것일까요??

  • # 5만 페이지 스킵 쿼리
    explain select * from ( select article_id from article where board_id = 1 ORDER BY article_id DESC limit 30 offset 1499970 ) t left join article on t.article_id = article.article_id;
    해당 쿼리에서는 Using where; Using index 이렇게 나옵니다.

    explain select * from article where board_id = 1 order by article_id desc limit 30 offset 90;
    해당 쿼리에서는 Usind index condition이 나옵니다

    저는 MySQL 쿼리문을 터미널에서 실행한게 아닌 DataGrip으로 실행 했는데 여기서 차이가 있는 걸까요??

답변 3

1

쿠케님의 프로필 이미지
쿠케
지식공유자

음.. 위 내용만으로는 파악이 어렵네요..!

짐작 가는 부분은 인덱스 컬럼 누락 또는 순서 변경이 있었을지 싶은데,

board_id asc, article_id desc 순서대로 잘 만들어져있는지 다시 확인해보시겠어요?

박철현님의 프로필 이미지
박철현
질문자

image.png
explain select * from (
 select article_id 
 from article 
 where board_id = 1 
 order by article_id desc limit 30 offset 1499970 )
    t left join article on t.article_id = article.article_id;

해당 쿼리에서 Using where와 Using index가 나옵니다.

explain select * from article
                 where board_id = 1
                 order by article_id desc
                 limit 30 offset 90;

해당 쿼리에서는 Using index condition이 나옵니다
--테이블 정보--

create table article ( 
article_id bigint not null primary key, 
title varchar(100) not null, board_id bigint not null, 
writer_id bigint not null, 
created_at datetime not null,
modified_at datetime not null, 
content varchar(3000) null
 ) engine = InnoDB; 

create index idx_board_id_article_id on article (board_id asc, article_id desc); 

 

쿠케님의 프로필 이미지
쿠케
지식공유자

음 쿼리도 이상 없어보이고, 인덱스도 멀쩡해보이는데..

전 동일 쿼리 아래처럼 잘 나와서 이상하군요..!?

스크린샷 2025-02-02 오전 12.55.05.png

  

혹시 터미널에서 아래 두 개의 명령어 실행 결과도 보여주실 수 있을까요?

desc article;

스크린샷 2025-02-02 오전 12.59.45.png

show index from article;

스크린샷 2025-02-02 오전 12.59.27.png

 

explain 명령어 결과도 전체 다 보여주시면 감사하겠습니다! 

그리고 테스트 데이터도 강의와 동일하게 1번 게시판에 게시글을 생성한게 맞을까요?

 

1

쿠케님의 프로필 이미지
쿠케
지식공유자

철현님, 안녕하세요!

DataGrip이어도 실행 계획은 동일해야할 것 같습니다.
실행한 쿼리, 쿼리 계획, 인덱스 사진 첨부 가능하실까요?!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 박철현님.

MySQL에서 EXPLAIN 명령어를 사용할 때, “Using where”와 “Using index”가 함께 나타나는 이유에 대해 설명드리겠습니다. 이 상황은 커버링 인덱스와 관련이 있으며, MySQL이 쿼리를 최적화하는 방식 때문입니다.

커버링 인덱스 개념

  • 커버링 인덱스는 쿼리가 인덱스만으로 모든 필요한 데이터를 제공할 수 있는 경우를 말합니다. 즉, MySQL은 데이터 파일로의 추가적인 디스크 I/O 없이 인덱스만으로 쿼리를 충족할 수 있습니다.

“Using where”와 “Using index”의 의미

  • Using index: 이는 쿼리가 인덱스를 활용하여 데이터 액세스를 수행하며, 모든 필요한 데이터가 인덱스만으로 충족된다는 것을 의미합니다. 이 경우, 커버링 인덱스가 제대로 작동하고 있다는 신호입니다.

  • Using where: 이 옵션은 MySQL이 테이블에서 적어도 일부 데이터를 필터링하기 위해 WHERE 절을 사용하고 있음을 나타냅니다. 이는 인덱스 자체에서 가져온 데이터를 추가로 필터링해야 하는 경우입니다.

“Using where”와 “Using index”가 함께 나타나는 경우

“Using index”와 “Using where”가 함께 나타날 때는, 인덱스가 커버링 인덱스로 작용하고 있지만, WHERE 절에 의한 조건을 추가로 만족시켜야 하기 때문입니다.

DataGrip을 통한 실행 여부

DataGrip과 같은 도구를 사용하여 쿼리를 실행하는 것은 MySQL의 쿼리 처리 방식에 영향을 미치지 않으며, 동일하게 동작합니다. 따라서, EXPLAIN 쿼리의 결과는 터미널에서 실행했을 때와 DataGrip에서 실행했을 때 동일해야 합니다.

이해를 돕기 위해 비슷한 문제를 다룬 인프런 커뮤니티 게시물을 참고하실 수 있습니다:
- MySQL 커버링 인덱스 이해하기: “Using where”와 “Using index” 사례 (게시글 제목)

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.