기술나눔

Mysql explain문에 대한 자세한 설명과 예제 표시

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

먼저 SQL을 간략하게 소개합니다.

SQL 언어는 데이터 쿼리 언어 DQL, 데이터 조작 언어 DML, 데이터 정의 언어 DDL, 데이터 제어 언어 DCL의 네 가지 범주로 나뉩니다.

1. 데이터 쿼리 언어 DQL
데이터 쿼리 언어 DQL의 기본 구조는 SELECT 절, FROM 절, WHERE 절로 구성된 쿼리 블록입니다. SELECT <필드명 테이블> FROM <테이블 또는 뷰 이름> WHERE <쿼리 조건>

2. 데이터 조작 언어 DML
데이터 조작 언어 DML에는 세 가지 주요 형태가 있습니다.
1) 삽입: 삽입
2) 업데이트: 업데이트
3) 삭제: 삭제

3. 데이터 정의 언어 DDL
데이터 정의 언어 DDL은 데이터베이스 ----- 테이블, 뷰, 인덱스, 동의어, 클러스터 등의 다양한 개체를 생성하는 데 사용됩니다. CREATE TABLE / VIEW / INDEX / SYN / CLUSTER 테이블 뷰 인덱스 동의어 클러스터 | . DDL 작업은 암시적으로 제출됩니다! 롤백할 수 없습니다.

4. 데이터 제어 언어 DCL
데이터 제어 언어 DCL은 데이터베이스에 액세스하기 위한 특정 권한을 부여하거나 취소하고, 데이터베이스 조작 트랜잭션의 시간과 효과를 제어하고, 데이터베이스를 모니터링하는 데 사용됩니다. 좋다:
1) GRANT: 승인.
2) ROLLBACK [WORK] TO [SAVEPOINT] : 특정 지점으로 롤백합니다. Rollback---ROLLBACK 롤백 명령은 데이터베이스 상태를 마지막으로 제출된 상태로 되돌립니다. 형식은 다음과 같습니다: SQL>ROLLBACK;
3) COMMIT [작업]: 제출합니다. 데이터베이스 삽입, 삭제 및 수정 작업 중에 트랜잭션은 데이터베이스에 제출될 때만 완료됩니다. 트랜잭션이 커밋되기 전에는 데이터베이스를 운영하는 사람만이 수행된 작업을 볼 수 있는 권한이 있습니다. 다른 사람은 최종 커밋이 완료된 후에만 볼 수 있습니다.

승인서 정보

데이터베이스 인증 명령:

사용자에게 테이블 이름(또는 열 이름)에 대한 GRANT<permission>

정답 옵션 B: 삽입, 선택: 권한 테이블 이름: 사용자 사용자: nkw

보충 지식 포인트 - 재활용 권한

FROM 사용자의 테이블 이름(또는 열 이름)에 대한 REVOKE <permission>

설명문 소개

실행 계획을 보기 위한 명령문으로 사용되는 explain 명령문은 다들 잘 아실 거라 믿습니다. explain은 SQL 최적화 분석에 자주 사용됩니다.

여기서는 주목할 가치가 있습니다. explain은 실제로 명령문을 실행하지 않고 실행 계획만 표시합니다.

어떤 정보를 볼 수 있나요?

  • 테이블 읽기 순서
  • 데이터 읽기 작업의 작업 유형
  • 사용할 수 있는 인덱스
  • 실제로 사용되는 인덱스
  • 테이블 간 참조
  • 최적화 프로그램이 쿼리하는 각 테이블의 행 수

기본 구문 소개

  1. EXPLAIN SELECT select具体语句
  2. 如:
  3. EXPLAIN SELECT * FROM userpro

각 열의 기능을 설명하세요.

목록설명하다다시 채우다
ID각 SELECT 키워드는 ID에 해당합니다.

선택_유형

SELECT 키워드에 해당하는 쿼리 유형
테이블테이블 이름
파티션일치하는 파티션 정보
유형단일 테이블에 대한 액세스 방법
가능한 키가능한 인덱스
열쇠실제 사용된 인덱스
키_길이사용된 실제 인덱스 길이
참조인덱스 열 동등 쿼리 사용 시, 동등성을 위한 인덱스 열과 일치하는 개체 정보입니다.
읽을 예상 레코드 수
거르는검색 기준으로 필터링한 후 남은 기록의 비율

    

추가의

추가 정보

               

EXPLAIN의 각 컬럼에 대한 자세한 소개

1,아이디

각 SELECT 키워드는 ID에 해당합니다.

id 값이 클수록 우선순위가 높아 먼저 실행됩니다.

ID가 동일할 경우 하나의 그룹으로 간주하여 위에서 아래로 순차적으로 실행될 수 있습니다.

각 ID 번호는 독립적인 쿼리를 나타냅니다. SQL 문의 쿼리 수가 적을수록 좋습니다.

2,선택_유형

범주설명하다
단순한단일 테이블 쿼리, 하위 쿼리 또는 UNION 쿼리 없음.
주요한쿼리의 가장 바깥쪽 SELECT 문입니다.
하위 쿼리WHERE 절에는 하위 쿼리가 사용됩니다.
파생된FROM 절에 포함된 하위 쿼리의 경우 MySQL은 이를 DERIVED(파생)로 표시하고 외부 쿼리에서 사용할 결과 집합에 대한 임시 테이블을 생성합니다.
노동 조합UNION 쿼리의 두 번째 및 후속 쿼리 문입니다.
노동조합 결과UNION 쿼리의 결과 집합입니다.
종속 하위 쿼리하위 쿼리의 결과는 외부 쿼리의 값에 따라 달라지며 하위 쿼리는 외부 쿼리의 각 행에 대해 한 번씩 실행됩니다.
종속 노동 조합UNION 쿼리의 두 번째 및 후속 쿼리 문과 결과는 외부 쿼리의 값에 따라 달라집니다.
캐시할 수 없는 하위 쿼리하위 쿼리는 캐시할 수 없으며 참조될 때마다 실행됩니다.

3. 테이블 열은 테이블의 테이블 이름을 나타냅니다(때때로 실제 테이블 이름이 아닐 수도 있고 약어일 수도 있음).

4. 파티션(선택사항)

5. 타입☆

일반적인 유형은 다음과 같습니다

유형설명하다
체계일반적으로 테이블에는 행이 하나만 있습니다. SELECT ... FROM DUAL 쿼리 최적화.
구성하다쿼리는 인덱스를 통해 한 번만 발견되며 결과 행은 하나만 있습니다(상수 테이블).
등호 참조다른 테이블에서 행을 찾으려면 고유 인덱스나 기본 키를 사용하세요.
참조다른 테이블에서 하나 이상의 행을 찾으려면 고유하지 않은 인덱스를 사용하십시오.
범위인덱스를 사용하여 행 범위를 반환합니다.
색인전체 테이블을 스캔하는 대신 인덱스를 완전히 스캔하여 행을 찾습니다.
모두전체 테이블 스캔은 테이블의 모든 행을 검사합니다.

일반적으로 모든 것을 피하려고 노력하십시오.

6, 키와 가능한_키

  1. 열쇠

    • key 필드에는 쿼리에서 사용되는 실제 인덱스가 표시됩니다.이 필드의 값이 다음과 같은 경우NULL , 인덱스가 사용되지 않음을 나타냅니다. 이 필드에 값이 있으면 MySQL이 지정된 인덱스를 사용하여 쿼리를 실행했음을 의미합니다.
  2. 가능한 키

    • possible_keys 필드에는 MySQL이 사용할 수 있는 인덱스 목록이 표시됩니다. 이러한 인덱스는 쿼리에서 고려될 수 있지만 실제로 사용되지는 않는 인덱스입니다. 대개,possible_keys 에 나열된 인덱스는 쿼리 조건 및 테이블 구조에 따라 결정됩니다.
  • 만약에 key 필드에는 인덱스 이름이 있으며possible_keys 여러 인덱스 이름이 에 나열되어 있으며 이는 MySQL이 선택했음을 나타냅니다.key 필드가 나열된 인덱스는 쿼리를 수행하는 데 사용되고 다른 인덱스는 쿼리를 수행하는 데 사용됩니다.possible_keys Medium은 또한 고려될 수 있지만 궁극적으로 사용되지는 않는다고 말했습니다.

  • 만약에 key 필드는 다음과 같습니다.NULL,그리고 possible_keys 여러 인덱스 이름이 에 나열되어 있는데, 이는 MySQL이 쿼리를 실행할 때 어떤 인덱스도 사용하지 않음을 나타내며, 이로 인해 전체 테이블 스캔이나 기타 인덱스가 아닌 최적화된 액세스 방법이 발생할 수 있습니다.

7,키_길이

key_len 인덱스 키의 길이를 설명하는 필드입니다. MySQL이 특정 인덱스를 사용하여 쿼리를 실행할 때 인덱스 사용량과 인덱스 키 길이를 나타냅니다.

  1. 단일 열 인덱스

    • 단일 열 인덱스가 사용되고 열 유형이 고정 길이인 경우(예: INT),하지만 key_len 값은 열의 길이입니다.
    • 가변 길이 필드가 사용되는 경우(예: VARCHAR),하지만 key_len 값은 필드의 최대 길이입니다.
  2. 복합지수

    • 복합 인덱스(즉, 여러 열을 포함하는 인덱스)의 경우key_len 인덱스에 있는 모든 열의 전체 길이를 나타냅니다.
  3. 결합지수

    • 여러 컬럼의 결합 인덱스를 쿼리에 사용하는 경우key_len 결합된 인덱스에 있는 모든 열의 총 길이입니다.
  4. 색인 접두어

    • 어떤 경우에는 MySQL이 인덱스의 일부만 사용할 수도 있습니다. 예를 들어 인덱스의 접두사를 인덱스의 일부로 사용하여 쿼리를 실행할 수 있습니다. 이 경우,key_len 사용된 인덱스 부분의 실제 길이가 표시됩니다.

8,참고문헌

ref 테이블 간의 연결 조건을 기술하거나, 고유하지 않은 인덱스를 이용하여 검색하는 필드입니다. 이는 쿼리를 실행할 때 MySQL이 테이블에 액세스하기 위해 사용하는 조인 조건이나 인덱스를 나타냅니다.

9,줄

rows 쿼리를 실행할 때 액세스하거나 검사한 행 수의 추정치입니다.

  • 간단하게 SELECT 문의,rows 반환할 예상 행 수를 나타냅니다.
  • 조인 쿼리의 경우(JOIN) 또는 하위 쿼리,rows 조인 작업 중에 액세스된 행 수를 나타낼 수 있습니다.
  • 테이블 스캔(전체 테이블 스캔 또는 인덱스 스캔)의 경우,rows 스캔된 행 수를 나타낼 수 있습니다.

10,필터링됨

WHERE 조건 및 인덱스 조건을 기준으로 필터링된 행의 비율을 나타냅니다. 필터링됨은 최적화 프로그램에서 추정한 쿼리 최적화 효과를 반영합니다.

언제 filtered 100%에 가까우면 쿼리 조건이 조건을 충족하지 않는 대부분의 행을 효과적으로 필터링했음을 의미하며 이는 일반적으로 좋은 최적화 지표입니다.

반대로 만약에 filtered 값이 낮으면 쿼리 조건이 충분히 정확하지 않거나 최적화 프로그램이 인덱스를 효과적으로 사용하여 데이터를 필터링하지 않음을 나타낼 수 있습니다.

11,추가

추가 정보 필드

다음은 몇 가지 일반적인 것입니다. Extra 필드와 그 의미:

  1. 인덱스 사용

    • 쿼리가 포함 인덱스를 사용함을 나타냅니다. 즉, 테이블의 실제 데이터 행에 액세스하지 않고도 쿼리 결과가 인덱스를 통해 완전히 반환될 수 있음을 나타냅니다.
  2. 어디에서 사용

    • 스토리지 엔진이 인덱스에서 행을 완료하는 대신 행을 검색한 후 MySQL 서버가 조건부 필터링을 수행함을 나타냅니다.
  3. 임시 사용

    • MySQL이 쿼리를 처리하기 위해 메모리에 임시 테이블을 생성했음을 나타냅니다. 집계 함수가 포함된 쿼리 또는 정렬 작업에 일반적으로 사용됩니다.
  4. filesort 사용하기

    • MySQL이 쿼리를 처리하기 위해 파일 정렬을 수행했음을 나타냅니다. 이는 일반적으로 인덱스를 사용하여 정렬을 수행할 수 없을 때 발생합니다.
  5. 각 레코드에 대해 범위가 검사됨(인덱스 맵: ...)

    • MySQL은 인덱스를 사용하여 각 레코드가 지정된 범위 내에 있는지 확인함을 나타냅니다.이것은 일반적으로 다음과 같은 경우에 발생합니다.range 쿼리 유형.
  6. NULL 키에 대한 전체 스캔

    • MySQL이 NULL 값과 일치하는 행을 찾기 위해 인덱스에서 전체 테이블 스캔을 수행했음을 나타냅니다.
  7. 별개의

    • MySQL이 일치하는 첫 번째 행을 찾은 후 중복 행 검색을 중지함을 나타냅니다.
  8. 조인 버퍼 사용(블록 중첩 루프)

    • MySQL이 연결 작업을 처리하기 위해 연결 버퍼를 사용하고 있음을 나타냅니다. 이는 일반적으로 연결 테이블 수가 많거나 연결 테이블의 크기가 클 때 발생합니다.
  9. 불가능한 곳

    • MySQL 최적화 프로그램이 WHERE 절의 조건을 충족할 수 없으므로 어떤 행도 스캔되지 않는다고 결정했음을 나타냅니다.
  10. 테이블을 사용하지 않음

    • 쿼리에 테이블이 포함되지 않음을 나타냅니다. 예를 들어 SELECT NOW()

실제 실행 화면 설명

데이터 준비

테이블 s1 생성

  1. CREATE TABLE s1 (
  2. id INT AUTO_INCREMENT,
  3. key1 VARCHAR(100),
  4. key2 INT,
  5. key3 VARCHAR(100),
  6. key_part1 VARCHAR(100),
  7. key_part2 VARCHAR(100),
  8. key_part3 VARCHAR(100),
  9. common_field VARCHAR(100),
  10. PRIMARY KEY (id),
  11. INDEX idx_key1 (key1),
  12. UNIQUE INDEX idx_key2 (key2),
  13. INDEX idx_key3 (key3),
  14. INDEX idx_key_part(key_part1, key_part2, key_part3)
  15. ) ENGINE=INNODB CHARSET=utf8;

테이블 s2 생성

  1. CREATE TABLE s2 (
  2. id INT AUTO_INCREMENT,
  3. key1 VARCHAR(100),
  4. key2 INT,
  5. key3 VARCHAR(100),
  6. key_part1 VARCHAR(100),
  7. key_part2 VARCHAR(100),
  8. key_part3 VARCHAR(100),
  9. common_field VARCHAR(100),
  10. PRIMARY KEY (id),
  11. INDEX idx_key1 (key1),
  12. UNIQUE INDEX idx_key2 (key2),
  13. INDEX idx_key3 (key3),
  14. INDEX idx_key_part(key_part1, key_part2, key_part3)
  15. ) ENGINE=INNODB CHARSET=utf8;

데이터는 직접 준비합니다.

샘플 실행 및 결과

간단한 쿼리

단일 테이블 쿼리

EXPLAIN SELECT * FROM `s1`;

조인 쿼리

EXPLAIN SELECT * FROM `s1` INNER JOIN `s2`;

하위 쿼리

  1. EXPLAIN SELECT * FROM s1 WHERE key1 IN (SELECT key2 FROM s2 WHERE common_field
  2. = 'a');

특별 디스플레이

select_type 표시
  1. #Union 去重
  2. EXPLAIN SELECT * FROM `s1` UNION SELECT * FROM `s2`;
  3. #Union 全查
  4. EXPLAIN SELECT * FROM `s1` UNION ALL SELECT * FROM `s2`;

마지막 단계는 중복 제거이므로 임시 테이블이 사용됩니다. 그러나 UNION ALL은 모두에 대한 쿼리이므로 임시 테이블 쿼리 메시지는 나타나지 않습니다.

유형 클래스

const (인덱스를 한 번 찾으십시오. 결과는 한 행만 찾습니다)

EXPLAIN SELECT * FROM s1 WHERE id = 10002;

eq_ref(고유 인덱스 또는 기본 키를 사용하여 다른 테이블에서 행 찾기)

EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;

ref(다른 테이블에서 하나 이상의 행을 찾으려면 고유하지 않은 인덱스를 사용)

EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';

range(인덱스를 사용하여 행 범위를 반환)

EXPLAIN SELECT * FROM s1 WHERE key1 IN ('a', 'b', 'c');

인덱스(행을 찾기 위해 인덱스를 완전히 스캔함)

EXPLAIN SELECT key_part2 FROM s1 WHERE key_part3 = 'a';

기타 디스플레이

필터링된 소수 시간

EXPLAIN SELECT * FROM s1 WHERE key1 > 'za' AND common_field = 'la'