>  기사  >  데이터 베이스  >  MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

青灯夜游
青灯夜游앞으로
2020-07-07 16:04:1313184검색

MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

1. EXPLAIN 소개

EXPLAIN 키워드를 사용하면 MySQL이 SQL 문을 처리하는 방법을 알 수 있도록 SQL 쿼리 문을 실행하는 최적화 프로그램을 시뮬레이션할 수 있습니다. 쿼리 문이나 테이블 구조의 성능 병목 현상을 분석합니다.
EXLAIN을 통해 다음과 같은 결과를 분석할 수 있습니다.

  • 테이블의 읽기 순서
  • 데이터 읽기 작업의 작업 유형
  • 어떤 인덱스를 사용할 수 있는지
  • 어떤 인덱스가 실제로 사용되는지
  • 사이 tables Quote
  • 옵티마이저가 쿼리하는 각 테이블의 행 수

다음과 같이 사용됩니다.

EXPLAIN +SQL 문

EXPLAIN SELECT * FROM t1

실행 계획에 포함된 정보
MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

2. 실행 계획 필드

2.1 id

Select 절이나 작업 테이블이 쿼리에서 실행되는 순서를 나타내는 숫자 집합을 포함한 선택 쿼리의 시퀀스 번호

id가 3개 있습니다. id

  • id의 결과가 동일하고 실행 순서가 위에서 아래로
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
    [요약] 테이블을 로드하는 순서는 위 테이블 열과 같습니다: t1 t3 t2

  • id가 다른 경우 id의 일련번호가 증가합니다. id 값이 클수록 우선순위가 높아집니다.

MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

  • id는 같지만 다르며, 동시에 존재한다
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
    위 그림과 같이 id가 1일 때 테이블에는 <derived2></derived2>가 표시되는데, 이는 테이블을 의미한다. t3 테이블의 파생 테이블인 ID 2를 사용합니다. <derived2></derived2> ,这里指的是指向id为2的表,即t3表的衍生表。

2.2 select_type

常见和常用的值有如下几种:
MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
分别用来表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

  • SIMPLE 简单的select查询,查询中不包含子查询或者UNION

  • PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY

  • SUBQUERY 在SELECT或WHERE列表中包含了子查询

  • DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表

  • 2.2 select_type
  • 일반적이고 일반적으로 사용되는 값은 다음과 같습니다.

    여기에 그림 설명 쓰기
  • 는 쿼리 유형을 나타내는 데 사용되며 주로 일반 쿼리, 결합 쿼리, 하위 쿼리 등과 같은 복잡한 쿼리를 구별하는 데 사용됩니다.
  • SIMPLE 단순 선택 쿼리, 쿼리에 하위 쿼리 또는 UNION이 포함되지 않음

PRIMARY 쿼리에 복잡한 항목이 포함된 경우 하위 파트 , 가장 바깥쪽 쿼리는 PRIMARY로 표시됩니다.

SUBQUERY SELECT 또는 WHERE 목록에 하위 쿼리가 포함되어 있습니다.
MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

DERIVED FROM 목록에 있습니다. 하위 쿼리 에 포함된 항목은 DERIVED(파생)로 표시됩니다. MySQL은 이러한 하위 쿼리를 재귀적으로 실행하고 임시 테이블에 결과를

UNION 저장합니다. 두 번째 UNION 다음에 SELECT가 나타나면 UNION으로 표시됩니다. FROM 절의 하위 쿼리에 UNION이 포함된 경우 외부 SELECT는 다음과 같이 표시됩니다. DERIVED🎜🎜🎜🎜UNION 테이블🎜🎜🎜 🎜2.3 테이블🎜🎜에서 결과를 얻는 UNION RESULT SELECT 🎜🎜2.4 type🎜🎜type은 쿼리에 어떤 유형이 사용되었는지 보여줍니다. type에 포함된 유형은 다음과 같습니다. 🎜🎜🎜최고에서 최악까지: 🎜
system > const > eq_ref > ref > range > index > all
🎜🎜 일반적으로, 쿼리가 최소한 범위 수준에 도달하고 바람직하게는 참조에 도달하도록 보장하는 데 필요합니다. 🎜🎜
  • system 테이블에는 단 하나의 레코드 행만 있습니다(시스템 테이블과 동일). 이것은 일반적으로 무시할 수 없는 특수 열입니다. const는 인덱스를 통해 한 번만 발견된다는 의미이며, 기본키나 고유 인덱스를 비교할 때 const를 사용합니다. 한 행의 데이터만 일치하므로 속도가 매우 빠릅니다. where 목록에 기본 키를 배치하면 MySQL은 쿼리를 상수로 변환할 수 있습니다. system 表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计
  • const 表示通过索引一次就找到了,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
    首先进行子查询得到一个结果的d1临时表,子查询条件为id = 1 是常量,所以type是const,id为1的相当于只查询一条记录,所以type为system。
  • eq_ref  唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
  • ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
  • range  只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
  • index  Full Index Scan,Index与All区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘读取的)
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
    id是主键,所以存在主键索引
  • all  Full Table Scan  将遍历全表以找到匹配的行
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

2.5 possible_keys 和 key

possible_keys 显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用

key

  • 实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
  • 查询中若使用了覆盖索引(select 后要查询的字段刚好和创建的索引字段完全相同),则该索引仅出现在key列表中
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
    MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

2.6 key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好여기에 그림 설명 쓰기
먼저 하위 쿼리를 수행하여 결과 d1 임시 테이블에서 하위 쿼리 조건은 id = 1, 즉 상수이므로 유형은 const입니다. id 1은 하나의 레코드만 쿼리하는 것과 동일하므로 유형은 system입니다. MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)eq_ref 고유 인덱스 스캔, 각 인덱스 키에 대해 테이블의 단 하나의 레코드만 일치합니다. 기본 키 또는 고유 인덱스 스캔에서 흔히 볼 수 있습니다.

ref 고유하지 않은 인덱스 스캔은 단일 값과 일치하는 모든 행을 반환합니다. 이는 기본적으로 일치하는 모든 행을 반환하는 인덱스 액세스입니다. 그러나 단일 값 행의 경우 일치하는 여러 행을 찾을 수 있으므로 찾기와 검색을 혼합해야 합니다.

여기에 사진 설명을 쓰세요

range는 인덱스를 사용하여 행을 선택하여 특정 범위의 행만 검색합니다. 키 열은 일반적으로 between, , in 등과 같은 쿼리가 where에 표시됩니다. 이 범위 스캔 인덱스는 전체 인덱스를 스캔하지 않고 인덱스의 특정 지점에서 시작하여 다른 지점에서 끝나기만 하면 되기 때문에 전체 테이블 스캔보다 낫습니다.

여기에 사진 설명을 쓰세요
index 전체 인덱스 스캔에서 Index와 All의 차이점은 인덱스 유형이 인덱스 트리만 통과한다는 것입니다. 인덱스 파일은 일반적으로 데이터 파일보다 작기 때문에 일반적으로 ALL보다 빠릅니다. (즉, all과 Index는 모두 테이블 전체를 읽지만, index는 인덱스에서 읽고, all은 하드 디스크에서 읽습니다.) MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)여기에 그림 설명 쓰기

id가 기본 키이므로 기본 키 인덱스가 있습니다

모두 전체 테이블 스캔 일치하는 행을 찾기 위해 전체 테이블을 순회합니다

2.5 available_keys 및 key
MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)possible_keys 이 테이블에 적용될 수 있는 하나 이상의 인덱스를 표시합니다. 쿼리와 관련된 필드에 색인이 존재하는 경우 해당 색인은 목록에 표시되지만 실제로는 쿼리에서 사용되지 않을 수 있습니다.

key

사용된 실제 인덱스입니다. NULL인 경우 인덱스가 사용되지 않습니다. (가능한 이유에는 색인이 생성되지 않거나 색인 오류가 포함됨)

쿼리에서 covering index를 사용한 경우(선택 후 쿼리할 필드가 생성된 인덱스 필드와 정확히 동일) 인덱스는 키 목록에만 나타납니다.


여기에 그림 설명 쓰기MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)2.6 key_len

🎜은 키를 나타냅니다. 인덱스에 사용된 바이트 수입니다. 이 열은 쿼리에 사용된 인덱스의 길이를 계산하는 데 사용할 수 있습니다. 길이가 짧을수록 정확도가 떨어지지 않습니다. key_len에 의해 표시되는 값은 사용된 실제 길이가 아닌 인덱스 필드의 가능한 최대 길이입니다. 즉, key_len은 테이블에서 검색되는 것이 아니라 테이블 정의를 기반으로 계산됩니다. 🎜🎜🎜🎜2.7 ref🎜🎜 인덱스를 표시하는 열이 사용되며 가능하면 상수를 사용하는 것이 좋습니다. 인덱싱된 열의 값을 찾는 데 사용되는 열 또는 상수입니다. 🎜🎜🎜🎜2.8행🎜🎜테이블 통계 및 인덱스 선택을 기반으로 필요한 레코드를 찾기 위해 읽어야 하는 행 수를 대략적으로 추정합니다. 즉, 적을수록 좋습니다.🎜🎜🎜🎜2.9 Extra🎜 🎜다른 열에서 명시적으로 사용하기에는 적합하지 않지만 매우 중요한 추가 정보가 포함되어 있습니다.🎜🎜2.9.1 filesort 사용(narrow escape)🎜🎜mysql이 데이터를 읽는 대신 외부 인덱스를 사용하여 데이터를 정렬함을 나타냅니다. 테이블 Pick 내의 인덱스 순서. MySQL에서 인덱스를 사용하여 완료할 수 없는 정렬 작업을 "파일 정렬"이라고 합니다. 🎜🎜🎜

2.9.2 Using temporary(十死无生)

使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

2.9.3 Using index(发财了)

表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)
MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

2.9.4 Using where

表明使用了where过滤

2.9.5 Using join buffer

表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。

2.9.6 impossible where

where子句的值总是false,不能用来获取任何元组

SELECT * FROM t_user WHERE id = '1' and id = '2'

2.9.7 select tables optimized away

在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

2.9.8 distinct

优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

3. 实例分析

MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)

  • 执行顺序1:select_type为UNION,说明第四个select是UNION里的第二个select,最先执行【select name,id from t2】
  • 执行顺序2:id为3,是整个查询中第三个select的一部分。因查询包含在from中,所以为DERIVED【select id,name from t1 where other_column=’’】
  • 执行顺序3:select列表中的子查询select_type为subquery,为整个查询中的第二个select【select id from t3】
  • 执行顺序4:id列为1,表示是UNION里的第一个select,select_type列的primary表示该查询为外层查询,table列被标记为<derived3></derived3>,表示查询结果来自一个衍生表,其中derived3中的3代表该查询衍生自第三个select查询,即id为3的select。【select d1.name …】
  • 执行顺序5:代表从UNION的临时表中读取行的阶段,table列的表示用第一个和第四个select的结果进行UNION操作。【两个结果union操作】

推荐学习:mysql教程

위 내용은 MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제