EXPLAIN 키워드를 사용하면 MySQL이 SQL 문을 처리하는 방법을 알 수 있도록 SQL 쿼리 문을 실행하는 최적화 프로그램을 시뮬레이션할 수 있습니다. 쿼리 문이나 테이블 구조의 성능 병목 현상을 분석합니다.
➤ EXLAIN을 통해 다음과 같은 결과를 분석할 수 있습니다.
➤ 다음과 같이 사용됩니다.
EXPLAIN +SQL 문
EXPLAIN SELECT * FROM t1
실행 계획에 포함된 정보
Select 절이나 작업 테이블이 쿼리에서 실행되는 순서를 나타내는 숫자 집합을 포함한 선택 쿼리의 시퀀스 번호
id가 3개 있습니다. id
id의 결과가 동일하고 실행 순서가 위에서 아래로
[요약] 테이블을 로드하는 순서는 위 테이블 열과 같습니다: t1 t3 t2
id가 다른 경우 id의 일련번호가 증가합니다. id 값이 클수록 우선순위가 높아집니다.
<derived2></derived2>
가 표시되는데, 이는 테이블을 의미한다. t3 테이블의 파생 테이블인 ID 2를 사용합니다. <derived2></derived2>
,这里指的是指向id为2的表,即t3表的衍生表。常见和常用的值有如下几种:
分别用来表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。
SIMPLE 简单的select查询
,查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂的
子部分,最外层查询则被标记为PRIMARY
SUBQUERY 在SELECT或WHERE列表中包含了子查询
DERIVED 在FROM列表中包含的子查询被标记为DERIVED
(衍生),MySQL会递归执行这些子查询,把结果放在临时表
일반적이고 일반적으로 사용되는 값은 다음과 같습니다.
단순 선택 쿼리
, 쿼리에 하위 쿼리 또는 UNION이 포함되지 않음
PRIMARY 쿼리에 복잡한 항목이 포함된 경우
하위 파트 , 가장 바깥쪽 쿼리는 PRIMARY로 표시됩니다.
SUBQUERY SELECT 또는 WHERE 목록에 하위 쿼리가 포함되어 있습니다.
하위 쿼리 에 포함된 항목은 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就能将该查询转换为一个常量。eq_ref
唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描ref
非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。range
只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。index
Full Index Scan,Index与All区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘读取的)all
Full Table Scan 将遍历全表以找到匹配的行possible_keys
显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
key
覆盖索引
(select 后要查询的字段刚好和创建的索引字段完全相同),则该索引仅出现在key列表中表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好
먼저 하위 쿼리를 수행하여 결과 d1 임시 테이블에서 하위 쿼리 조건은 id = 1, 즉 상수이므로 유형은 const입니다. id 1은 하나의 레코드만 쿼리하는 것과 동일하므로 유형은 system입니다. eq_ref
고유 인덱스 스캔, 각 인덱스 키에 대해 테이블의 단 하나의 레코드만 일치합니다. 기본 키 또는 고유 인덱스 스캔에서 흔히 볼 수 있습니다.
ref
고유하지 않은 인덱스 스캔은 단일 값과 일치하는 모든 행을 반환합니다. 이는 기본적으로 일치하는 모든 행을 반환하는 인덱스 액세스입니다. 그러나 단일 값 행의 경우 일치하는 여러 행을 찾을 수 있으므로 찾기와 검색을 혼합해야 합니다.
range
는 인덱스를 사용하여 행을 선택하여 특정 범위의 행만 검색합니다. 키 열은 일반적으로 between, , in 등과 같은 쿼리가 where에 표시됩니다. 이 범위 스캔 인덱스는 전체 인덱스를 스캔하지 않고 인덱스의 특정 지점에서 시작하여 다른 지점에서 끝나기만 하면 되기 때문에 전체 테이블 스캔보다 낫습니다. index
전체 인덱스 스캔에서 Index와 All의 차이점은 인덱스 유형이 인덱스 트리만 통과한다는 것입니다. 인덱스 파일은 일반적으로 데이터 파일보다 작기 때문에 일반적으로 ALL보다 빠릅니다. (즉, all과 Index는 모두 테이블 전체를 읽지만, index는 인덱스에서 읽고, all은 하드 디스크에서 읽습니다.)
모두
전체 테이블 스캔 일치하는 행을 찾기 위해 전체 테이블을 순회합니다 2.5 available_keys 및 keypossible_keys
이 테이블에 적용될 수 있는 하나 이상의 인덱스를 표시합니다. 쿼리와 관련된 필드에 색인이 존재하는 경우 해당 색인은 목록에 표시되지만 실제로는 쿼리에서 사용되지 않을 수 있습니다.
key
covering index
를 사용한 경우(선택 후 쿼리할 필드가 생성된 인덱스 필드와 정확히 동일) 인덱스는 키 목록에만 나타납니다.
2.6 key_len
使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
表明使用了where过滤
表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。
where子句的值总是false
,不能用来获取任何元组
SELECT * FROM t_user WHERE id = '1' and id = '2'
在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作
<derived3></derived3>
,表示查询结果来自一个衍生表,其中derived3中的3代表该查询衍生自第三个select查询,即id为3的select。【select d1.name …】执行顺序5:代表从UNION的临时表中读取行的阶段,table列的表示用第一个和第四个select的结果进行UNION操作。【两个结果union操作】
推荐学习:mysql教程
위 내용은 MySQL에서의 사용법 및 결과 분석 설명(자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!