>  기사  >  데이터 베이스  >  mysql explain의 역할은 무엇입니까?

mysql explain의 역할은 무엇입니까?

coldplay.xixi
coldplay.xixi원래의
2020-06-29 16:10:142778검색

mysql explain의 기능은 Mysql 최적화 프로그램이 SQL 쿼리 문을 실행하는 방법을 시뮬레이션하여 Mysql이 사용자의 SQL 문을 처리하는 방법을 파악하고, 데이터 검색 효율성을 향상시키며, 데이터베이스의 IO 비용을 줄이는 것입니다.

mysql explain의 역할은 무엇입니까?

mysql explain의 기능은 다음과 같습니다:

Mysql이 SQL 문을 처리하는 방법을 알기 위해 Mysql 최적화 프로그램이 SQL 쿼리 문을 실행하는 방법을 시뮬레이션합니다. 쿼리 문이나 테이블 구조의 성능 병목 현상을 분석합니다.

mysql> explain select * from tb_user;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | tb_user | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL  |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+

(1) id 열:

(1)、id 相同执行顺序由上到下
mysql> explain  
    -> SELECT*FROM tb_order tb1
    -> LEFT JOIN tb_product tb2 ON tb1.tb_product_id = tb2.id
    -> LEFT JOIN tb_user tb3 ON tb1.tb_user_id = tb3.id;
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                       | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
|  1 | SIMPLE      | tb1   | ALL    | NULL          | NULL    | NULL    | NULL                      |    1 | NULL  |
|  1 | SIMPLE      | tb2   | eq_ref | PRIMARY       | PRIMARY | 4       | product.tb1.tb_product_id |    1 | NULL  |
|  1 | SIMPLE      | tb3   | eq_ref | PRIMARY       | PRIMARY | 4       | product.tb1.tb_user_id    |    1 | NULL  |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
(2)、如果是子查询,id序号会自增,id值越大优先级就越高,越先被执行。
mysql> EXPLAIN
    -> select * from tb_product tb1 where tb1.id = (select tb_product_id from  tb_order tb2 where id = tb2.id =1);
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | PRIMARY     | tb1   | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL        |
|  2 | SUBQUERY    | tb2   | ALL   | NULL          | NULL    | NULL    | NULL  |    1 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
(3)、id 相同与不同,同时存在
mysql> EXPLAIN 
    -> select * from(select * from tb_order tb1 where tb1.id =1) s1,tb_user tb2 where s1.tb_user_id = tb2.id;
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL  |    1 | NULL  |
|  1 | PRIMARY     | tb2        | const  | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
|  2 | DERIVED     | tb1        | const  | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
derived2:衍生表   2表示衍生的是id=2的表 tb1

관련 학습 권장 사항: mysql video tutorial

(2) select_type 열: 데이터 읽기 작업의 작업 유형

1. SIMPLE: 단순 쿼리를 선택하면 SQL에 하위 쿼리나 UNION이 포함되지 않습니다.

  2. PRIMARY: 복잡한 하위 쿼리 부분이 포함된 쿼리이며, 가장 바깥쪽 쿼리는 PRIMARY

 로 표시됩니다. 3. SUBQUERY: 하위 쿼리가 select 또는 WHERE 목록에 포함됩니다.

4. DERIVED: FROM 목록에 포함됩니다. 하위 쿼리는 DERIVED(파생 테이블)로 표시되며 MYSQL은 이러한 하위 쿼리를 재귀적으로 실행하고 결과 집합을 제로 타임 테이블에 넣습니다.

 5. UNION: UNION 다음에 두 번째 SELECT가 나타나면 UNION으로 표시되고, FROM 절의 하위 쿼리에 UNION이 포함되면 외부 SELECT는 DERIVED

 6. UNION RESULT: 선택

UNION 테이블에서 결과를 얻으려면 (3) 테이블 열: 어떤 테이블의 데이터 행이 대략

(4) 유형 열: 액세스 유형 최고 시스템에서 최악 시스템까지 > ref > range > index > ALL

1. system: 테이블에는 단 하나의 레코드가 있습니다(시스템 테이블과 동일). 정상적인 업무에 나타납니다. system:表只有一条记录(等于系统表),这是const类型的特例,平时业务中不会出现。

2、const:通过索引一次查到数据,该类型主要用于比较primary key 或者unique 索引,因为只匹配一行数据,所以很快;如果将主键置于WHERE语句后面,Mysql就能将该查询转换为一个常量。

3、eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或者唯一索引扫描。

4、ref:非唯一索引扫描,返回匹配某个单独值得所有行,本质上是一种索引访问,它返回所有匹配某个单独值的行,就是说它可能会找到多条符合条件的数据,所以他是查找与扫描的混合体。

  详解:这种类型表示mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每一个数据都进行一 一的扫描判断,也就是所谓你平常理解的使用索引查询会更快的取出数据。而要想实现这种查找,索引却是有要求的,要实现这种能快速查找的算法,索引就要满足特定的数据结构。简单说,也就是索引字段的数据必须是有序的,才能实现这种类型的查找,才能利用到索引。

5、range:只检索给定范围的行,使用一个索引来选着行。key列显示使用了哪个索引。一般在你的WHERE 语句中出现between 、66f7a98850431fb8c0d9470a35d9d294 、in 等查询,这种给定范围扫描比全表扫描要好。因为他只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。

6、index:FUll Index Scan 扫描遍历索引树(index:这种类型表示是mysql会对整个该索引进行扫描。要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个复合索引的一部分,mysql都可能会采用index类型的方式扫描。但是呢,缺点是效率不高,mysql会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引)。

7、ALL

2. const: 인덱스를 통해 데이터를 한 번 찾습니다. 이 유형은 주로 기본 키 또는 고유 인덱스를 비교하는 데 사용됩니다. 키가 WHERE 문 뒤에 배치되면 Mysql은 쿼리를 상수로 변환할 수 있습니다.

3. eq_ref: 각 인덱스 키에 대해 테이블의 레코드 하나만 일치합니다. 기본 키 또는 고유 인덱스 스캔에서 흔히 볼 수 있습니다.

4. ref: 고유하지 않은 인덱스 스캔은 단일 값과 일치하는 모든 행을 반환합니다. 이는 기본적으로 단일 값과 일치하는 모든 행을 반환하므로 가능합니다. 조건에 맞는 데이터가 여러 개 발견되므로 검색과 스캔이 혼합됩니다.

 자세한 설명: 이 유형은 일반적으로 인덱스를 사용하여 검색하는 방식으로 인덱스의 모든 데이터를 하나씩 스캔하고 판단하는 대신 mysql이 특정 알고리즘을 기반으로 정규화된 인덱스를 빠르게 찾는다는 것을 의미합니다. 데이터가 더 빨라집니다. 이러한 종류의 검색을 수행하려면 인덱스가 필요합니다. 이 빠른 검색 알고리즘을 구현하려면 인덱스가 특정 데이터 구조를 충족해야 합니다. 간단히 말해서 이러한 유형의 검색을 수행하고 인덱스를 사용하려면 인덱스 필드의 데이터가 있어야 합니다.

5. 범위: 지정된 범위의 행만 검색하고 색인을 사용하여 행을 선택합니다. 키 열에는 사용된 인덱스가 표시됩니다. 일반적으로 between, 95ec6993dc754240360e28e0de8de30a 및 in과 같은 쿼리는 WHERE 문에 나타납니다. 이러한 종류의 지정된 범위 스캔은 전체 테이블 스캔보다 좋습니다. 전체 인덱스를 스캔하지 않고 인덱스의 특정 지점에서 시작하고 다른 지점에서 끝나기만 하면 되기 때문입니다.

6. index: FUll Index Scan은 인덱스 트리를 스캔하고 순회합니다. (index: 이 유형은 mysql이 전체 ​​인덱스를 스캔한다는 의미입니다. 이 유형의 인덱스를 사용하려면 인덱스 트리를 스캔하십시오. 특별한 요구 사항은 없습니다. 인덱스이거나 복합 인덱스의 일부인 경우 mysql은 인덱스 유형을 사용하여 스캔할 수 있지만 단점은 첫 번째 데이터를 하나씩 스캔한다는 것입니다. 판정조건에 맞는 인덱스를 찾을 때까지 마지막 데이터를 찾는다.)

7. ALL: 디스크에서 데이터를 얻기 위해 전체 테이블을 스캔합니다. ALL 유형의 수백만 데이터를 최대한 최적화합니다. 🎜🎜🎜 (5) available_keys 열 🎜: 이 테이블에 적용될 수 있는 하나 이상의 인덱스를 표시합니다. 쿼리와 관련된 필드에 대한 인덱스가 존재하는 경우 해당 인덱스가 나열되지만 실제로 쿼리에서 사용되지 않을 수 있습니다. 🎜🎜🎜 (6) 키 열: 🎜실제 사용된 인덱스입니다. NULL인 경우 인덱스가 사용되지 않습니다. 쿼리에 포함 인덱스가 사용된 경우 해당 인덱스는 키 목록에만 나타납니다. 포함 인덱스: 선택 후 필드는 우리가 인덱스하는 필드 수와 일치합니다. 🎜🎜🎜(7) ken_len 열: 🎜인덱스에 사용된 바이트 수를 나타냅니다. 이 열은 쿼리에 사용된 인덱스 길이를 계산하는 데 사용할 수 있습니다. 정확도를 잃지 않으면서 길이가 짧을수록 좋습니다. key_len에 의해 표시되는 값은 사용된 실제 길이가 아닌 인덱스 필드의 가능한 최대 길이입니다. 즉, key_len은 테이블 정의에 따라 계산되며 테이블에서 검색되지 않습니다. 🎜

(八)ref列:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。

(九)rows列(每张表有多少行被优化器查询):根据表统计信息及索引选用的情况,大致估算找到所需记录需要读取的行数。

(十)Extra列:扩展属性,但是很重要的信息。

1、 Using filesort(文件排序):mysql无法按照表内既定的索引顺序进行读取。
 mysql> explain select order_number from tb_order order by order_money;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | tb_order | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)
说明:order_number是表内的一个唯一索引列,但是order by 没有使用该索引列排序,所以mysql使用不得不另起一列进行排序。
2、Using temporary:Mysql使用了临时表保存中间结果,常见于排序order by 和分组查询 group by。
mysql> explain select order_number from tb_order group by order_money;
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
|  1 | SIMPLE      | tb_order | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using temporary; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)
3、Using index 表示相应的select 操作使用了覆盖索引,避免访问了表的数据行,效率不错。
如果同时出现Using where ,表明索引被用来执行索引键值的查找。
如果没有同时出现using where 表明索引用来读取数据而非执行查找动作。
mysql> explain select order_number from tb_order group by order_number;
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
| id | select_type | table    | type  | possible_keys      | key                | key_len | ref  | rows | Extra       |
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
|  1 | SIMPLE      | tb_order | index | index_order_number | index_order_number | 99      | NULL |    1 | Using index |
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
1 row in set (0.00 sec)
4、Using where 查找
5、Using join buffer :表示当前sql使用了连接缓存。
6、impossible where :where 字句 总是false ,mysql 无法获取数据行。
7、select tables optimized away:
8、distinct:

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

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