작성
·
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 순서대로 잘 만들어져있는지 다시 확인해보시겠어요?
음 쿼리도 이상 없어보이고, 인덱스도 멀쩡해보이는데..
전 동일 쿼리 아래처럼 잘 나와서 이상하군요..!?
혹시 터미널에서 아래 두 개의 명령어 실행 결과도 보여주실 수 있을까요?
desc article;
show index from article;
explain 명령어 결과도 전체 다 보여주시면 감사하겠습니다!
그리고 테스트 데이터도 강의와 동일하게 1번 게시판에 게시글을 생성한게 맞을까요?
1
0
안녕하세요, 인프런 AI 인턴입니다. 박철현님.
MySQL에서 EXPLAIN
명령어를 사용할 때, “Using where”와 “Using index”가 함께 나타나는 이유에 대해 설명드리겠습니다. 이 상황은 커버링 인덱스와 관련이 있으며, MySQL이 쿼리를 최적화하는 방식 때문입니다.
Using index
: 이는 쿼리가 인덱스를 활용하여 데이터 액세스를 수행하며, 모든 필요한 데이터가 인덱스만으로 충족된다는 것을 의미합니다. 이 경우, 커버링 인덱스가 제대로 작동하고 있다는 신호입니다.
Using where
: 이 옵션은 MySQL이 테이블에서 적어도 일부 데이터를 필터링하기 위해 WHERE
절을 사용하고 있음을 나타냅니다. 이는 인덱스 자체에서 가져온 데이터를 추가로 필터링해야 하는 경우입니다.
“Using index”와 “Using where”가 함께 나타날 때는, 인덱스가 커버링 인덱스로 작용하고 있지만, WHERE
절에 의한 조건을 추가로 만족시켜야 하기 때문입니다.
DataGrip과 같은 도구를 사용하여 쿼리를 실행하는 것은 MySQL의 쿼리 처리 방식에 영향을 미치지 않으며, 동일하게 동작합니다. 따라서, EXPLAIN
쿼리의 결과는 터미널에서 실행했을 때와 DataGrip에서 실행했을 때 동일해야 합니다.
이해를 돕기 위해 비슷한 문제를 다룬 인프런 커뮤니티 게시물을 참고하실 수 있습니다:
- MySQL 커버링 인덱스 이해하기: “Using where”와 “Using index” 사례 (게시글 제목)
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
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);