>  기사  >  데이터 베이스  >  mysql에서 explain의 사용법은 무엇입니까?

mysql에서 explain의 사용법은 무엇입니까?

WBOY
WBOY원래의
2022-03-07 10:59:556232검색

mysql에서 explain 명령은 주로 SQL 문의 실행 계획을 보는 데 사용됩니다. 이 명령은 mysql이 사용자의 SQL 문을 어떻게 처리하는지 알기 위해 최적화 프로그램을 시뮬레이션할 수 있습니다. SQL 문 설명;".

mysql에서 explain의 사용법은 무엇입니까?

이 튜토리얼의 운영 환경: windows10 시스템, mysql8.0.22 버전, Dell G3 컴퓨터.

mysql에서 explain의 사용법은 무엇인가요?

explain 명령은 주로 SQL 문의 실행 계획을 확인하고, SQL 문의 인덱스 사용 여부, 전체 테이블 스캔 수행 여부 등을 확인하는 데 사용됩니다. MySQL이 사용자 SQL 문을 처리하는 방법을 알기 위해 SQL 쿼리 문을 실행하는 최적화 프로그램을 시뮬레이션할 수 있습니다.

일상 작업에서는 실행하는 데 시간이 오래 걸리는 일부 SQL 문을 기록하기 위해 느린 쿼리를 실행하는 경우가 있습니다. 이러한 SQL 문을 찾았다고 해서 해당 SQL 문을 보는 경우가 종종 있습니다. explain 명령어를 통해 SQL 문의 실행 계획, SQL 문의 인덱스 사용 여부, Full Table Scan 수행 여부 등을 확인할 수 있다. 따라서 우리는 MySQL의 비용 기반 최적화 프로그램에 대해 자세히 알아보고, 최적화 프로그램이 고려할 수 있는 많은 액세스 전략과 SQL 문을 실행할 때 최적화 프로그램이 채택할 것으로 예상되는 전략에 대한 세부 정보도 얻을 수 있습니다.

-- 实际SQL,查找用户名为Jefabc的员工
select * from emp where name = 'Jefabc';
-- 查看SQL是否使用索引,前面加上explain即可
explain select * from emp where name = 'Jefabc'

Expain에는 id, select_type, table, type, available_keys, key, key_len, ref,rows, Extra

요약 설명:

id: 식별자 선택

select_type: 쿼리 유형을 나타냅니다.

table: 결과 집합을 출력하는 테이블

partitions: 일치하는 파티션

type: 테이블의 연결 유형을 나타냅니다.

possible_keys: 쿼리 시 사용할 수 있는 인덱스를 나타냅니다.

key: 사용된 실제 인덱스를 나타냅니다.

key_len: 인덱스 필드의 길이

ref: 열과 인덱스의 비교

rows: 스캔된 행 수(예상 행 수)

filtered: 테이블 조건으로 필터링된 행의 비율

추가: 실행에 대한 설명 및 설명

다음은 이러한 필드의 모양에 대한 가능한 설명입니다.

1.id

SELECT 식별자. 이것은 SELECT

SQL 실행 순서를 식별하는 것으로 이해됩니다. SQL은 큰 것부터 작은 것까지 실행됩니다

1. ID가 동일할 경우 실행 순서는 위에서 아래입니다

. 2. 서브 쿼리인 경우 id 값이 클수록 우선 순위가 높아져 먼저 실행됩니다. 3. id가 동일하면 id로 간주할 수 있습니다. 전체 그룹 중에서 위에서 아래로 순차적으로 실행되며, id 값이 클수록 우선순위가 높아집니다.

-- 查看在研发部并且名字以Jef开头的员工,经典查询
explain select e.no, e.name from emp e left join dept d on e.dept_no = d.no where e.name like 'Jef%' and d.name = '研发部';

2. select_type

각 select 절의 유형을 나타냅니다. 쿼리에서

(1) SIMPLE(단순 SELECT, UNION 또는 하위 쿼리 등을 사용하지 않음)

(2) PRIMARY(하위 쿼리의 가장 바깥쪽 쿼리, 쿼리에 복잡한 하위 부분이 포함된 경우 가장 바깥쪽 선택이 표시됨 as PRIMARY)

(3) UNION(UNION의 두 번째 또는 후속 SELECT 문)

(4) DEPENDENT UNION(외부 쿼리에 따라 UNION의 두 번째 또는 후속 SELECT 문)

(5) UNION RESULT ( UNION의 결과, Union 문의 두 번째 선택은 모든 후속 선택을 시작합니다. 하위 쿼리의 첫 번째 SELECT는 외부 쿼리에 따라 다름)

(8) DERIVED(파생 테이블의 SELECT, FROM 절의 하위 쿼리)

(9) UNCACHEABLE SUBQUERY(하위 쿼리의 결과는 캐시될 수 없으며, 외부 링크의 첫 번째 행을 재평가해야 함)

3. Table

이 단계의 결과를 표시합니다. 데이터베이스의 테이블 이름에 액세스합니다(이 행의 데이터가 참조하는 테이블이 아닌 경우도 있음). 실제 테이블 이름은 위의 e, d와 같은 약어일 수도 있고 해당 단계의 실행 결과에 대한 약어일 수도 있습니다

4. 유형

테이블 액세스 방법은 MySQL이 필요한 테이블을 찾는 방법을 나타냅니다. "액세스 유형"이라고도 알려진 테이블의 행입니다.

일반적으로 사용되는 유형은 다음과 같습니다: ALL, index, range, ref, eq_ref, const, system, NULL(왼쪽에서 오른쪽으로, 성능이 나쁨에서 좋음 순)

ALL: 전체 테이블 스캔, MySQL은 전체 테이블을 탐색하여 찾습니다. 행 일치

index: 전체 인덱스 스캔, 인덱스와 ALL의 차이점은 인덱스 유형은 인덱스 트리만 통과한다는 것입니다.

range: 지정된 범위의 행만 검색하고 인덱스를 사용하여 행을 선택합니다.

ref : 위 테이블의 연결 일치 조건, 즉 인덱스 열의 값을 찾기 위해 어떤 열이나 상수를 사용하는지 나타냅니다.

eq_ref: ref와 유사하지만 사용되는 인덱스는 각각 고유한 인덱스라는 점입니다. 즉, 다중 테이블 연결에서 기본 키나 고유 키를 연관 조건으로 사용하는 것입니다.

const, system: MySQL이 쿼리의 특정 부분을 최적화할 때 이를 상수로 변환하려면 이러한 유형의 액세스를 사용하세요. 기본 키가 where 목록에 있으면 MySQL은 쿼리를 상수로 변환할 수 있습니다. 시스템은 쿼리 테이블에 행이 하나만 있는 경우 system

NULL을 사용합니다. 최적화 프로세스에서는 실행 중에 테이블이나 인덱스에 액세스할 필요도 없습니다. 예를 들어 인덱스 열에서 최소값을 선택하는 것은 별도의 인덱스 조회를 통해 완료될 수 있습니다.

五、possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。

如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

六、Key

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中

如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

七、key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

不损失精确性的情况下,长度越短越好 

八、ref

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

九、rows

 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

十、Extra

该列包含MySQL解决查询的详细信息,有以下几种情况:

Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by

Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”

-- 测试Extra的filesort
explain select * from emp order by name;

Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。

Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

No tables used:Query语句中使用from dual 或不含任何from子句

-- explain select now() from dual;

总结:

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

• EXPLAIN不考虑各种Cache

• EXPLAIN不能显示MySQL在执行查询时所作的优化工作

• 部分统计信息是估算的,并非精确值

• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

通过收集统计信息不可能存在结果

推荐学习:mysql视频教程

위 내용은 mysql에서 explain의 사용법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.