작성
·
16
0
database mysql을 사용하다가 질문드립니다
create index idx_items_stock_quantity on items(stock_quantity);
이렇게 인덱스를 생성하고 order by를 다음과 같이 stock_quantity를 기준으로 한다면,
explain select * from items
order by stock_quantity;
이렇게 실행계획을 보면 이 쿼리의 type이 적어도 ALL로 나오진 않을거라고 생각했습니다. 그냥 인덱스를 stock_quantity를 기준으로 생성하면 알아서 정렬이 되어 있을 거니까요. 그런데, 실제로 확인해보니까 type이 ALL로 나옵니다. 왜 그런걸까요?
(by Claude Sonnet 4.5) select *
의 경우
1. stock_quantity 인덱스를 활용한 랜덤 I/O를 하는 경우
2. 테이블을 순차적으로 쭉 읽는 순차 I/O를 하는 경우
이 두 경우 중 옵티마이저가 2번째 방법을 활용해서 그렇다고 합니다. 그냥 이렇게 알고 있으면 될까요?
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. 뎅뚠님.
MySQL에서 인덱스의 사용과 관련된 실행 계획(Type)에 대해 궁금한 점이 있으신 것 같습니다.
기본적으로, SELECT *
쿼리를 사용할 때 옵티마이저는 가능한 가장 효율적인 방식으로 데이터를 검색하려고 합니다. 인덱스를 정렬 목적으로 사용한다고 해도, 테이블에서 모든 데이터를 읽어야 한다면 ALL
스캔이 발동될 수 있는데, 이는 인덱스를 사용하지 않고 테이블 전체를 읽는 것이 더 효율적일 수 있기 때문입니다.
선택성: 옵티마이저는 인덱스의 선택성(Selectivity)에 크게 의존합니다. 인덱스된 컬럼의 값이 매우 균일하게 고르게 분포되어 있지 않다면, 인덱스 사용이 오히려 더 많은 I/O를 발생시킬 수 있습니다.
체계적 스캔: 인덱스를 통해 읽고 다시 본 테이블을 참조하는 것보다 단순히 테이블 전체를 한 번에 읽는 것이 효율적일 수 있습니다. 특히, SELECT *
를 사용할 경우 테이블 내 모든 데이터를 가져와야 하므로 옵티마이저가 INDEX
스캔 대신 테이블 스캔(ALL
)을 선택할 수 있습니다.
인덱스 구조: 생성된 인덱스는 특정한 정렬 방식(예: ASC 또는 DESC)으로만 도움이 되며, 그 반대의 경우에는 유리하지 않을 수도 있습니다.
간단히 요약하자면, 인덱스를 생성했다고 해서 항상 그것이 정렬에 사용되는 것은 아닙니다. 옵티마이저는 테이블의 데이터 분포도, 인덱스 선택성, 엔진의 설정 등을 기반으로 결정합니다.
아래는 관련된 인프런 강의에서 살펴볼 수 있는 유사한 질문과 답변입니다. 추가 정보를 원하시면 참고해주세요:
이외에도 더 많은 인덱스와 정렬에 대한 자세한 정보를 SQL 문서나 강의 자료에서 참고하시면 좋을 것 같습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.