데이터베이스 성능 최적화는 애플리케이션의 성능을 향상시키는 중요한 부분 중 하나입니다.
쿼리 실행 계획 확인은 데이터베이스 쿼리가 어떻게 실행되는지 이해하고, 문제를 식별하고 해결하는데 도움이 됩니다.
이 블로그 글에서는 쿼리 실행 계획 확인에 대해 자세히 알아보겠습니다.
쿼리 실행 계획이란 무엇인가?
- 쿼리 실행 계획은 데이터베이스 관리 시스템 (DBMS)이 쿼리를 처리하는 방식을 설명하는 로드맵입니다.
- 쿼리 실행 계획은 DBMS의 옵티마이저에 의해 생성되며, 어떤 테이블을 스캔하고 어떤 인덱스를 사용할지 등을 포함합니다.
이 글에서는 mysql 기준으로 explain 했을때 나오는 쿼리실행계획을 설명해보고자 합니다
1. id
- id 항목은 쿼리 실행의 단계를 식별하는데 사용됩니다.
- 여러 테이블을 조인하는 경우, id는 쿼리의 실행 순서를 표시합니다.
2. select_type
- select_type은 쿼리의 형태를 나타냅니다. 예를 들어, SIMPLE, PRIMARY, SUBQUERY 등이 있습니다.
- 이것은 쿼리가 어떻게 실행되는지 이해하는데 도움이 됩니다.
3. table
- table은 해당 단계에서 사용되는 테이블의 이름입니다.
- 이것은 어떤 테이블이 어떤 단계에서 사용되는지 파악하는데 도움이 됩니다.
4. partitions
- partitions는 쿼리가 파티션 테이블에서 실행되는 경우, 어떤 파티션을 스캔하는지를 나타냅니다.
- 파티션 테이블의 경우 중요한 정보가 됩니다.
5. type
- type은 해당 테이블에서 어떤 탐색 방법을 사용하는지를 나타냅니다. 예를 들어, ALL, INDEX, RANGE 등이 있습니다.
- 이것은 인덱스 사용 여부와 성능에 영향을 미칩니다.
Type 의 상세 항목 설명은 아래내용 참고하시면 됩니다
더보기
- ALL:
- type이 ALL인 경우, MySQL은 테이블의 모든 레코드를 순차적으로 스캔합니다.
- 이는 가장 비효율적인 방식으로, 대규모 테이블에서는 성능 문제를 일으킬 수 있습니다.
- INDEX:
- type이 INDEX인 경우, MySQL은 전체 테이블을 스캔하지 않고 인덱스를 사용하여 데이터를 읽습니다.
- 인덱스는 테이블의 레코드를 찾는 데 도움을 주며 일반적으로 효율적입니다.
- RANGE:
- type이 RANGE인 경우, MySQL은 인덱스의 범위를 사용하여 특정 범위의 레코드를 선택합니다.
- 이는 범위 조건이 있는 쿼리에서 사용되며, 특정 값 범위를 검색할 때 유용합니다.
- INDEX FOR ORDER BY:
- type이 INDEX FOR ORDER BY인 경우, MySQL은 정렬된 결과를 얻기 위해 인덱스를 사용합니다.
- 주로 ORDER BY 절을 가진 쿼리에서 사용되며 정렬된 결과를 빠르게 얻을 수 있습니다.
- INDEX MERGE:
- type이 INDEX MERGE인 경우, MySQL은 여러 개의 인덱스를 병합하여 결과를 얻습니다.
- 여러 인덱스를 조합하여 쿼리의 필터링 조건을 처리할 때 사용됩니다.
- UNIQUE:
- type이 UNIQUE인 경우, MySQL은 유일한 인덱스 값을 검색합니다.
- 이는 주로 UNIQUE 제약 조건이 있는 열을 검색할 때 사용됩니다.
- FULLTEXT:
- type이 FULLTEXT인 경우, MySQL은 전체 텍스트 검색을 위해 인덱스를 사용합니다.
- 이는 텍스트 검색과 관련된 쿼리에서 사용됩니다.
- CONST:
- type이 CONST인 경우, MySQL은 상수 값을 사용하여 매우 빠르게 결과를 가져옵니다.
- 주로 프라이머리 키나 유일한 값에 대한 검색에서 사용됩니다.
- system:
- type이 system인 경우, MySQL은 단일 레코드를 반환하기 위해 내부 시스템 테이블을 사용합니다.
- 이는 최적화된 쿼리에서 사용됩니다.
- NULL:
- type이 NULL인 경우, MySQL은 쿼리 결과가 없음을 나타냅니다.
- 일치하는 레코드가 없을 때 사용됩니다.
6. possible_keys
- possible_keys는 사용 가능한 인덱스들을 보여줍니다. 이 항목은 인덱스 최적화에 도움이 됩니다.
7. key
- key는 실제로 사용된 인덱스의 이름을 표시합니다.
- 어떤 인덱스가 실제로 선택되었는지를 나타내므로 성능 향상에 중요합니다.
8. key_len
- key_len은 인덱스에서 실제로 사용된 길이를 나타냅니다.
- 이 값은 인덱스 효율성을 평가하는데 사용됩니다.
9. ref
- ref는 조인에서 사용되는 열을 보여줍니다.
- 어떤 열이 조인 조건으로 사용되었는지를 나타냅니다.
10. rows
- rows는 해당 테이블을 스캔할 때 예상되는 레코드 수를 표시합니다.
- 이 값은 쿼리의 복잡성과 성능을 평가하는데 사용됩니다.
11. filtered
- filtered는 행의 필터링 비율을 나타냅니다. 0에서 100 사이의 값으로, 낮은 값은 불필요한 데이터를 스캔한다는 것을 나타냅니다.
12. Extra
- Extra 항목에는 추가 정보가 포함됩니다. 예를 들어, 파일 정렬, 임시 테이블 사용, 인덱스 사용 여부 등을 알려줍니다.
이 블로그 글을 통해 데이터베이스 쿼리 실행 계획 확인에 대한 전문적인 지식을 습득하고, 애플리케이션의 성능을 향상시키는데 도움이 되길 바랍니다.
데이터베이스 성능 최적화는 매우 중요한 주제이며, 쿼리 실행 계획을 효과적으로 확인하는 능력은 개발자에게 큰 이점을 제공할 것입니다.
'에러해결 & 최적화 > DB' 카테고리의 다른 글
[쿼리튜닝]where문에 cast를 쓰면 안되는 이유 (1) | 2023.11.03 |
---|---|
인덱스 설계를 통한 쿼리속도 튜닝하기 (0) | 2023.10.31 |
쿼리튜닝의 핵심, 옵티마이저에 대해서 (0) | 2023.10.30 |
SQL 쿼리 튜닝하는 여러가지 방법 (0) | 2023.02.27 |
[최적화] SlowQuery 해결하기(복합 인덱스 문제) (2) | 2021.11.02 |