이 글은 MySQL에서의 explain 사용법을 요약(자세히)한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
실행 계획(쿼리 실행 계획)
Syntax
explain select * from table
explain
expain의 열에는 10개의 열이 있으며,
id, select_type, table, type, partitions, available_keys, key, key_len, ref,rows, 추가로, 이러한 필드의 모양에 대한 가능한 설명은 다음과 같습니다.
1. ID
SQL 실행 순서 식별, SQL은 큰 것부터 작은 것까지 실행됩니다.
1. 실행순서 위에서 아래로
2. 서브쿼리인 경우 ID값이 클수록 우선순위가 높아지며, 일찍 실행됩니다
3. ID는 동일하므로 위에서 아래로 그룹으로 간주할 수 있습니다. 모든 그룹에서 순차적으로 실행되며, ID 값이 클수록 우선 순위가 높아지고 더 일찍 실행됩니다
2. 쿼리의 각 SELECT 절 유형을 나타냅니다.
1 SIMPLE: 단순 SELECT, UNION 또는 하위 쿼리는 적용할 수 없습니다.
2. 기본: 가장 바깥쪽 선택.
3. UNION: 두 번째 레이어에서는 SELECT 다음에 UNION이 사용됩니다.
4. DEPENDENT UNION: UNION 문의 두 번째 SELECT는 외부 하위 쿼리에 따라 다릅니다.
5. UNION 결과: UNION의 결과입니다.
6. SUBQUERY: 하위 쿼리의 첫 번째 SELECT입니다.
7. 종속 하위 쿼리: 하위 쿼리의 첫 번째 SELECT는 외부 쿼리에 따라 다릅니다.
8 11. UNCACHEABLE UNION: UNION은 캐시할 수 없는 하위 쿼리의 두 번째 또는 마지막 선택에 속합니다.3.table
출력 행에서 참조하는 테이블의 이름입니다. 이는 다음 값 중 하나일 수도 있습니다.,...>: 이 행은 id 값 M과 id를 나타냅니다. 값은 N의 합집합입니다.
은 MySQL이 테이블에서 필요한 행을 찾는 방법("액세스 유형"이라고도 함)을 나타냅니다. 일반적으로 사용되는 유형은 다음과 같습니다: NULL, system, const, eq_ref, ref, range, index, ALL(왼쪽에서 오른쪽으로, 성능이 가장 나쁜 것부터 가장 좋은 것 순) 다음 목록에서는 가장 좋은 유형부터 가장 나쁜 유형까지의 연결 유형을 설명합니다.
MySQL은 최적화 프로세스 중에 명령문을 분해하며 실행 중에 테이블이나 인덱스에 액세스할 필요도 없습니다. 예를 들어 인덱스 열에서 최소값을 선택하는 것은 별도의 인덱스 조회를 통해 완료할 수 있습니다.
system
이 테이블에는 행이 하나만 있습니다(예: 시스템 테이블). 이것은 const 조인 유형
const의 특별한 경우입니다. 테이블에는 최대 하나의 일치하는 행이 있으며 쿼리 시작 부분에서 읽습니다. 행이 하나뿐이므로 나머지 최적화 프로그램은 이 행에 있는 열의 값을 상수로 처리할 수 있습니다. const 테이블은 한 번만 읽기 때문에 매우 빠릅니다.
SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref 이전 테이블의 각 행 조합에 대해 이 테이블에서 한 행을 읽습니다. system 및 const 유형 외에도 이는 최상의 연결 유형입니다. 조인이 인덱스의 모든 부분을 사용하고 인덱스가 PRIMARY KEY 인덱스 또는 UNIQUE NOT NULL 인덱스인 경우에 사용됩니다.
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref 위 표의 연결 일치 조건, 즉 인덱스 열의 값을 찾기 위해 어떤 열이나 상수를 사용하는지 나타냅니다.
fulltext FULLTEXT 인덱스를 사용하여 연결을 수행합니다.
ref_or_null
SELECT * FROM ref_table WHERE key_column IS NULL;
인덱스 병합 액세스 방법은 범위 스캔을 사용하여 여러 행을 검색하고 그 결과를 하나로 병합합니다. 이 액세스 방법은 단일 테이블의 인덱스 스캔만 결합하고 여러 테이블을 스캔하지 않습니다. 병합은 기본 스캔의 Union, Cross 또는 Cross-Union을 생성할 수 있습니다.
SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20; SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30; SELECT * FROM t1, t2 WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%') AND t2.key1 = t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1 = 1 AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);
이 유형은 일부 IN 하위 쿼리를 다음 형식의 eq_ref로 대체합니다.
value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery 이 조인 유형은 Unique_subquery와 유사합니다. IN 하위 쿼리를 대체하지만 다음 형식의 하위 쿼리에서 고유하지 않은 인덱스와 함께 작동합니다.
value IN (SELECT key_column FROM single_table WHERE some_expr)
range 인덱스를 사용하여 행을 선택하여 지정된 범위 내의 행만 검색합니다. 출력 행의 키 열은 사용할 인덱스를 나타냅니다. 가장 오랫동안 사용된 키 부분을 포함하는 key_len을 포함합니다. 참조 열 NULL이 이 유형에 적합합니다.
범위는 키 열을 상수 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE 또는 IN과 비교할 때 사용할 수 있습니다. () 연산자:
index
인덱스 조인 유형은 인덱스 트리를 스캔한다는 점을 제외하면 ALL과 동일합니다. 두 가지 상황이 있습니다:
1. 인덱스 트리는 인덱스가 쿼리에 대한 포함 인덱스이고 테이블에 필요한 모든 데이터를 충족하는 데 사용될 수 있는 경우에만 스캔됩니다. 이 경우 추가 열에는 인덱스 사용이 표시됩니다. 인덱스 전용 스캔은 일반적으로 테이블 데이터보다 크기가 작은 모든 인덱스보다 빠릅니다.
2. 인덱스에서 읽기를 사용하여 전체 테이블 스캔을 수행하여 인덱스 순서로 데이터 행을 찾습니다. 추가 열에는 색인 사용이 표시되지 않습니다. MySQL은 쿼리가 단일 인덱스에 속한 열만 사용할 때 이 연결 유형을 사용할 수 있습니다.
ALL
이전 테이블의 각 행 조합에 대해 전체 테이블 스캔을 수행합니다. 일반적으로 테이블이 const로 표시되지 않은 첫 번째 테이블이면 좋지 않으며 다른 모든 경우에는 일반적으로 매우 나쁩니다. 일반적으로 이전 테이블의 상수 값 또는 열 값을 기반으로 테이블에서 행 검색을 활성화하는 인덱스를 추가하면 이 문제를 모두 피할 수 있습니다.
#🎜 🎜# 이 열은 EXPLAIN 출력에 표시된 테이블 순서와 완전히 독립적입니다. 이는 available_keys의 일부 키가 생성된 테이블 순서에 실제로 사용될 수 없음을 의미합니다. 컬럼이 NULL이면 연관된 인덱스가 없습니다. 이 경우 WHERE 절을 확인하여 인덱싱에 적합한 특정 열을 참조하는지 확인하여 쿼리 성능을 향상시킬 수 있습니다. 그렇다면 적절한 인덱스를 생성하고 EXPLAIN Key(index)
로 쿼리를 다시 확인합니다. 인덱스를 선택하지 않으면 키는 NULL입니다. MySQL이 available_keys 열의 인덱스를 사용하거나 무시하도록 하려면 쿼리에서 FORCE INDEX, USE INDEX 또는 IGNORE INDEX를 사용하십시오.7.key_len
은 쿼리에 사용된 인덱스의 길이를 다음을 통해 계산할 수 있습니다. 이 열(key_len 표시된 값은 사용된 실제 길이가 아닌 인덱스 필드의 가능한 최대 길이입니다. 즉, key_len은 테이블에서 검색되지 않고 테이블 정의에 따라 계산됩니다.) 없음 정확도 손실, 길이가 짧을수록 좋음
8. ref은 위 표의 연결 매칭 조건, 즉 , 인덱스를 찾는 데 사용되는 열 또는 상수
열의 값 9.row은 MySQL이 찾을 위치를 추정함을 나타냅니다. 테이블 통계 및 인덱스 선택을 기반으로 하는 필수 레코드입니다. 읽을 행 수
10. Extra
추가 열 EXPLAIN 출력에는 다음이 포함됩니다. 쿼리를 해결하기 위한 MySQL에 대한 추가 정보입니다. 다음 목록에서는 이 열에 가능한 값을 설명합니다. 또한 각 항목은 추가 값을 표시하는 속성을 JSON 형식 출력에 나타냅니다. 그들 중 일부에는 특정 속성이 있습니다. 메시지 속성으로 표시되는 기타 텍스트
11. partitions (extension)
쿼리와 일치하는 파티션을 기록합니다. 이 열은 PARTITIONS 키워드를 사용할 때만 표시됩니다. 분할되지 않은 테이블에는 null이 표시됩니다
MySQL에 대한 자세한 내용은 PHP 중국어 웹사이트의 MySQL 튜토리얼 열을 참조하세요. ! !
위 내용은 MySQL에서의 explain 사용법 요약(상세)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!