详细介绍,explain用法和结果的含义

2019-05-02 06:07 来源:未知

原标题:《叶问》第7期

mysql explain用法和结果的意义 2012-11-23 17:18:13

Mysql Explain 详细介绍,mysqlexplain

Mysql Explain 这里做贰个材质的完善整治。

一.语法

explain < table_name >

例如: explain select * from t3 where id=3952602;

二.explain输出解释

---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------
| id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------

1.id

  作者的明亮是SQL推行的顺遂的标志,SQL从大到小的实施.

例如:

mysql> explain select * from (select * from ( select * from t3 where id=3952602) a) b;
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
| id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
|  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
|  2 | DERIVED     | <derived3> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
|  3 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------

很明朗那条SQL是从里向外的实施,便是从id=三 向上实行.

  1. select_type

不怕select类型,能够有以下

(1) SIMPLE

简言之SELECT(不采纳UNION或子查询等) 举例:

mysql> explain select * from t3 where id=3952602;

---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------
| id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------
|  1 | SIMPLE      | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------

(2). PRIMARY

自身的明亮是最外层的select.举个例子:

mysql> explain select * from (select * from t3 where id=3952602) a ;

---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
| id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
|  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
|  2 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------

(3).UNION

UNION中的第三个或前边的SELECT语句.比方

mysql> explain select * from t3 where id=3952602 union all select * from t3 ;

---- -------------- ------------ ------- ------------------- --------- --------- ------- ------ -------
| id | select_type  | table      | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
---- -------------- ------------ ------- ------------------- --------- --------- ------- ------ -------
|  1 | PRIMARY      | t3         | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
|  2 | UNION        | t3         | ALL   | NULL              | NULL    | NULL    | NULL  | 1000 |       |
|NULL | UNION RESULT | <union1,2> | ALL   | NULL              | NULL    | NULL    | NULL  | NULL |       |
---- -------------- ------------ ------- ------------------- --------- --------- ------- ------ -------

365bet官网中文版,(4).DEPENDENT UNION

UNION中的第3个或前边的SELECT语句,取决于外面包车型的士查询

mysql> explain select * from t3 where id in (select id from t3 where id=3952602 union all select id from t3)  ;

---- -------------------- ------------ -------- ------------------- --------- --------- ------- ------ --------------------------
| id | select_type        | table      | type   | possible_keys     | key     | key_len | ref   | rows | Extra                    |
---- -------------------- ------------ -------- ------------------- --------- --------- ------- ------ --------------------------
|  1 | PRIMARY            | t3         | ALL    | NULL              | NULL    | NULL    | NULL  | 1000 | Using where              |
|  2 | DEPENDENT SUBQUERY | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 | Using index              |
|  3 | DEPENDENT UNION    | t3         | eq_ref | PRIMARY,idx_t3_id | PRIMARY | 4       | func  |    1 | Using where; Using index |
|NULL | UNION RESULT       | <union2,3> | ALL    | NULL              | NULL    | NULL    | NULL  | NULL |                          |
---- -------------------- ------------ -------- ------------------- --------- --------- ------- ------ --------------------------

(4).UNION RESULT

UNION的结果。

mysql> explain select * from t3 where id=3952602 union all select * from t3 ;

---- -------------- ------------ ------- ------------------- --------- --------- ------- ------ -------
| id | select_type  | table      | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
---- -------------- ------------ ------- ------------------- --------- --------- ------- ------ -------
|  1 | PRIMARY      | t3         | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
|  2 | UNION        | t3         | ALL   | NULL              | NULL    | NULL    | NULL  | 1000 |       |
|NULL | UNION RESULT | <union1,2> | ALL   | NULL              | NULL    | NULL    | NULL  | NULL |       |
---- -------------- ------------ ------- ------------------- --------- --------- ------- ------ -------

(5).SUBQUERY

子查询中的第二个SELECT.

mysql> explain select * from t3 where id = (select id from t3 where id=3952602 )  ;

---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------------
| id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra       |
---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------------
|  1 | PRIMARY     | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |             |
|  2 | SUBQUERY    | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       |       |    1 | Using index |
---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------------

(6).  DEPENDENT SUBQUERY

子查询中的第三个SELECT,取决于外面的询问

mysql> explain select id from t3 where id in (select id from t3 where id=3952602 )  ;

---- -------------------- ------- ------- ------------------- --------- --------- ------- ------ --------------------------
| id | select_type        | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra                    |
---- -------------------- ------- ------- ------------------- --------- --------- ------- ------ --------------------------
|  1 | PRIMARY            | t3    | index | NULL              | PRIMARY | 4       | NULL  | 1000 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 | Using index              |
---- -------------------- ------- ------- ------------------- --------- --------- ------- ------ --------------------------

7).DERIVED

派生表的SELECT(FROM子句的子查询)

mysql> explain select * from (select * from t3 where id=3952602) a ;

---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
| id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
|  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
|  2 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------

3.table

来得那一行的数目是关于哪张表的.

偶尔不是实际的表名字,看到的是derivedx(x是个数字,作者的知道是第几步施行的结果)

mysql> explain select * from (select * from ( select * from t3 where id=3952602) a) b;

---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
| id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
|  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
|  2 | DERIVED     | <derived3> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
|  3 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------

4.type

那列很要紧,显示了连接使用了哪类档期的顺序,有无使用索引.

从最棒到最差的总是类型为const、eq_reg、ref、range、indexhe和ALL

(1).system

那是const联接类型的一个特例。表仅有1行满足条件.如下(t叁表上的id是 primary key)

mysql> explain select * from (select * from t3 where id=3952602) a ;

---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
| id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------
|  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
|  2 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
---- ------------- ------------ -------- ------------------- --------- --------- ------ ------ -------

(2).const

表最多有3个相称行,它将要查询开端时被读取。因为仅有一行,在那行的列值可被优化器剩余部分感觉是常数。const表异常快,因为它们只读取叁回!

const用于用常数值相比PLANDIMARAV肆Y KEY或UNIQUE索引的保有片段时。在底下的询问中,tbl_name能够用于const表:

SELECT * from tbl_name WHERE primary_key=1;
SELECT * from tbl_name WHERE primary_key_part1=1和 primary_key_part2=2;

例如:

mysql> explain select * from t3 where id=3952602;

---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------
| id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------
|  1 | SIMPLE      | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
---- ------------- ------- ------- ------------------- --------- --------- ------- ------ -------

(3). eq_ref

对此每种来自于前方的表的行组合,从该表中读取壹行。那恐怕是最佳的连通类型,除了const类型。它用在三个目录的装有片段被接入使用并且索引是UNIQUE或P昂CoraIMA福特ExplorerY KEY。

eq_ref能够用来采纳= 操作符比较的带索引的列。比较值可以为常量或二个运用在该表前面所读取的表的列的表明式。

在上边的例证中,MySQL能够使用eq_ref联接来拍卖ref_tables:

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;

例如

mysql> create unique index  idx_t3_id on t3(id) ;
Query OK, 1000 rows affected (0.03 sec)
Records: 1000  Duplicates: 0  Warnings: 0

mysql> explain select * from t3,t4 where t3.id=t4.accountid;

---- ------------- ------- -------- ------------------- ----------- --------- ---------------------- ------ -------
| id | select_type | table | type   | possible_keys     | key       | key_len | ref                  | rows | Extra |
---- ------------- ------- -------- ------------------- ----------- --------- ---------------------- ------ -------
|  1 | SIMPLE      | t4    | ALL    | NULL              | NULL      | NULL    | NULL                 | 1000 |       |
|  1 | SIMPLE      | t3    | eq_ref | PRIMARY,idx_t3_id | idx_t3_id | 4       | dbatest.t4.accountid |    1 |       |
---- ------------- ------- -------- ------------------- ----------- --------- ---------------------- ------ -------

(4).ref

对此每一个来自于前方的表的行组合,全数有相配索引值的将要从那张表中读取。要是连接只使用键的最左侧的前缀,或假诺键不是UNIQUE或PCRUISERIMA安德拉Y KEY(换句话说,纵然连接无法依据关键字采用单个行的话),则采用ref。假如利用的键仅仅匹配少许行,该联接类型是不利的。
ref能够用来接纳=或<=>操作符的带索引的列。

在上面包车型客车例子中,MySQL能够运用ref联接来管理ref_tables:

SELECT * FROM ref_table WHERE key_column=expr;

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;

例如:

mysql> drop index idx_t3_id on t3;
Query OK, 1000 rows affected (0.03 sec)
Records: 1000 Duplicates: 0 Warnings: 0

mysql> create index idx_t3_id on t3(id) ;
Query OK, 1000 rows affected (0.04 sec)
Records: 1000 Duplicates: 0 Warnings: 0

mysql> explain select * from t3,t4 where t3.id=t4.accountid;

---- ------------- ------- ------ ------------------- ----------- --------- ---------------------- ------ -------
| id | select_type | table | type | possible_keys     | key       | key_len | ref                  | rows | Extra |
---- ------------- ------- ------ ------------------- ----------- --------- ---------------------- ------ -------
|  1 | SIMPLE      | t4    | ALL  | NULL              | NULL      | NULL    | NULL                 | 1000 |       |
|  1 | SIMPLE      | t3    | ref  | PRIMARY,idx_t3_id | idx_t3_id | 4       | dbatest.t4.accountid |    1 |       |
---- ------------- ------- ------ ------------------- ----------- --------- ---------------------- ------ -------

2 rows in set (0.00 sec)

(5).  ref_or_null

该联接类型仿佛ref,但是增添了MySQL能够特意搜寻包括NULL值的行。在化解子查询中平日利用该联接类型的优化。

在底下的例子中,MySQL能够行使ref_or_null联接来管理ref_tables:

SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL;

(6). index_merge

该联接类型表示使用了目录合并优化措施。在那种状态下,key列包蕴了动用的目录的清单,key_len包蕴了应用的目录的最长的第一要素。

例如:

mysql> explain select * from t4 where id=3952602 or accountid=31754306 ;

---- ------------- ------- ------------- ---------------------------- ---------------------------- --------- ------ ------ ------------------------------------------------------
| id | select_type | table | type        | possible_keys              | key                        | key_len | ref  | rows | Extra                                                |
---- ------------- ------- ------------- ---------------------------- ---------------------------- --------- ------ ------ ------------------------------------------------------
|  1 | SIMPLE      | t4    | index_merge | idx_t4_id,idx_t4_accountid | idx_t4_id,idx_t4_accountid | 4,4     | NULL |    2 | Using union(idx_t4_id,idx_t4_accountid); Using where |
---- ------------- ------- ------------- ---------------------------- ---------------------------- --------- ------ ------ ------------------------------------------------------

1 row in set (0.00 sec)

(7). unique_subquery

该项目替换了下边情势的IN子查询的ref:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

unique_subquery是2个目录查找函数,能够完全替换子查询,效用越来越高。

(8).index_subquery

该联接类型类似于unique_subquery。可以轮换IN子查询,但只适合下列格局的子查询中的非唯一索引:

value IN (SELECT key_column FROM single_table WHERE some_expr)

(9).range

只检索给定范围的行,使用叁个索引来摘取行。key列呈现应用了哪位索引。key_len包含所运用索引的最长珍视要素。在该项目中ref列为NULL。

当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或然IN操作符,用常量相比较主要字列时,能够利用range

mysql> explain select * from t3 where id=3952602 or id=3952603 ;

---- ------------- ------- ------- ------------------- ----------- --------- ------ ------ -------------
| id | select_type | table | type  | possible_keys     | key       | key_len | ref  | rows | Extra       |
---- ------------- ------- ------- ------------------- ----------- --------- ------ ------ -------------
|  1 | SIMPLE      | t3    | range | PRIMARY,idx_t3_id | idx_t3_id | 4       | NULL |    2 | Using where |
---- ------------- ------- ------- ------------------- ----------- --------- ------ ------ -------------

1 row in set (0.02 sec)

(10).index

该联接类型与ALL一样,除了只有索引树被围观。这一般比ALL快,因为索引文件一般比数据文件小。

当查问只利用作为单索引壹局地的列时,MySQL能够选用该联接类型。

(11). ALL

对此每种来自于此前的表的行组合,进行整体的表扫描。若是表是第二个没标识const的表,这一般倒霉,并且普通在它意况下很差。平时能够追加愈来愈多的目录而毫无选拔ALL,使得行能基于前边的表中的常数值或列值被搜寻出。

5.possible_keys

possible_keys列提出MySQL能运用哪个索引在该表中找到行。注意,该列完全部独用立于EXPLAIN输出所示的表的先后。那表示在possible_keys中的有些键实际上无法按生成的表次序使用。

1经该列是NULL,则未有相关的目录。在那种场馆下,能够经过检查WHERE子句看是或不是它引用某个列或符合索引的列来升高你的询问品质。借使是那般,创建多个十三分的目录并且再度用EXPLAIN检查查询

  1. key

key列显示MySQL实际决定运用的键(索引)。假设未有选取索引,键是NULL。要想强制MySQL使用或忽略possible_keys列中的索引,在询问中应用FOPRADOCE INDEX、USE INDEX只怕IGNORE INDEX。

7.key_len

key_len列显示MySQL决定动用的键长度。要是键是NULL,则长度为NULL。
使用的目录的长短。在不损失准确性的意况下,长度越短越好

  1. ref

ref列显示应用哪个列或常数与key一同从表中选择行。

  1. rows

rows列呈现MySQL以为它实行查询时必须检查的行数。

  1. Extra

该列包含MySQL解决查询的详细音讯,下边详细.

(1).Distinct

壹经MYSQL找到了与行相联合相配的行,就不再寻觅了

(2).Not exists

MYSQL优化了LEFT JOIN,1旦它找到了相配LEFT JOIN规范的行,

就不再寻觅了

(3).Range checked for each

Record(index map:#)

从未有过找到理想的目录,因而对此在此之前方表中来的每3个行组合,MYSQL检查接纳哪个索引,并用它来从表中重回行。那是选择索引的最慢的连日之一

(4).Using filesort

观看那一个的时候,查询就须要优化了。MYSQL供给进行额外的手续来发掘什么对回到的行排序。它依据连年类型以及存款和储蓄排序键值和同盟原则的全套行的行指针来排序全体行

(5).Using index

列数据是从仅仅使用了目录中的音讯而尚未读取实际的步履的表再次来到的,那产生在对表的整个的伸手列都是同2个索引的有个别的时候

(6).Using temporary

总的来看这么些的时候,查询要求优化了。这里,MYSQL要求创造三个目前表来囤积结果,那平常爆发在对两样的列集进行O昂CoraDER BY上,而不是GROUP BY上

(7).Using where

运用了WHERE从句来界定哪些行将与下一张表匹配大概是回去给用户。借使不想回去表中的方方面面行,并且连接类型ALL或index,那就能产生,大概是查询有标题

多谢阅读,希望能支援到我们,多谢大家对本站的支撑!

Explain 详细介绍,mysqlexplain Mysql Explain 这里做一个资料的无微不至整治。 壹.语法 explain table_name 例如: explain select * from t3 where id=3952602; 二...

叶问

分类: Mysql/postgreSQL

《叶溢》是知数堂新设计的竞相栏目,不定时给大家提供才干知识小贴士,情势不限,或咨询、或钻探均可,并在同①天发布答案,让我们轻松利用零散时间就能够学到最实用的知识点。

最重纵然第三种用法,须要深远的垂询。

2018年8月9日,周四

先看3个事例:

MySQL的表中有唯一索引,设置unique_checks为0时,还是能够否写入重复值?

  1. mysql> explain select * from t_order; 
  2. ---- ------------- --------- ------ --------------- ------ --------- ------ -------- -------  
  3. | id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | Extra | 
  4. ---- ------------- --------- ------ --------------- ------ --------- ------ -------- -------  
  5. |  1 | SIMPLE      | t_order | ALL  | NULL          | NULL | NULL    | NULL | 100453 |       | 
  6. ---- ------------- --------- ------ --------------- ------ --------- ------ -------- -------  
  7. 1 row in set (0.03 sec) 

第一,固然设置unique_checks=0,也无能为力往唯一索引中写入重复值。

加上extended后之后:

其次,设置unique_checks=0的效益在于,批量导入数据(比如load data)时,在保管导入数据中无重复值时,不供给再度检查其唯一性,加快导入速度。

  1. mysql> explain extended select * from t_order; 
  2. ---- ------------- --------- ------ --------------- ------ --------- ------ -------- ---------- -------  
  3. | id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra | 
  4. ---- ------------- --------- ------ --------------- ------ --------- ------ -------- ---------- -------  
  5. |  1 | SIMPLE      | t_order | ALL  | NULL          | NULL | NULL    | NULL | 100453 |   100.00 |       | 
  6. ---- ------------- --------- ------ --------------- ------ --------- ------ -------- ---------- -------  
  7. 1 row in set, 1 warning (0.00 sec) 

所以,unique_checks=0并不是同意唯1约束失效,而是再批量导数据时不再逐行检查唯1性。

有须要解释一下那些漫长表格里每一列的意义:

2018年8月15日,周六

id SELECT识别符。这是SELECT的查询序列号
select_type

SELECT类型,可以为以下任何一种:

  • SIMPLE:简单SELECT(不使用UNION或子查询)
  • PRIMARY:最外面的SELECT
  • UNION:UNION中的第二个或后面的SELECT语句
  • DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
  • UNION RESULT:UNION 的结果
  • SUBQUERY:子查询中的第一个SELECT
  • DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
  • DERIVED:导出表的SELECT(FROM子句的子查询)
table

输出的行所引用的表

type

联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:

  • system:表仅有一行(=系统表)。这是const联接类型的一个特例。
  • const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
  • eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。
  • ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
  • ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
  • index_merge:该联接类型表示使用了索引合并优化方法。
  • unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
  • index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
  • range:只检索给定范围的行,使用一个索引来选择行。
  • index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
  • ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。
possible_keys

指出MySQL能使用哪个索引在该表中找到行

key 显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。
key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。
ref 显示使用哪个列或常数与key一起从表中选择行。
rows 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。
filtered 显示了通过条件过滤出的行数的百分比估计值。
Extra

该列包含MySQL解决查询的详细信息

  • Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
  • Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
  • range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
  • Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
  • Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
  • Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
  • Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
  • Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
  • Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。

某人曰,在数据检索的准绳中利用!=操作符时,存储引擎会放任使用索引。 理由:因为检索的界定不可能鲜明,所以使用索引作用不高,会被引擎自动改为全表扫描。

 

你承认他的说教吗?

一.select_type的说明

答:平日状态下,那个说法是不利的。当然,也有例外处境,话不能说纯属了。

1.UNION:

有二个测试表共80万条数据,个中type列只有1、二五个值,分别占比玖七%和三%。

当通过union来连接多少个查询结果时,第二个之后的select其select_type为UNION。

这种景况下,查询条件 WHERE type != 一,是有异常的大大概也足以走索引的。

  1. mysql> explain select * from t_order where order_id=100 union select * from t_order where order_id=200; 
  2. ---- -------------- ------------ ------- --------------- --------- --------- ------- ------ -------  
  3. | id | select_type  | table      | type  | possible_keys | key     | key_len | ref   | rows | Extra | 
  4. ---- -------------- ------------ ------- --------------- --------- --------- ------- ------ -------  
  5. |  1 | PRIMARY      | t_order    | const | PRIMARY       | PRIMARY | 4       | const |    1 |       | 
  6. |  2 | UNION        | t_order    | const | PRIMARY       | PRIMARY | 4       | const |    1 |       | 
  7. | NULL | UNION RESULT | <union1,2> | ALL   | NULL          | NULL    | NULL    | NULL  | NULL |       | 
  8. ---- -------------- ------------ ------- --------------- --------- --------- ------- ------ -------  
  9. 3 rows in set (0.34 sec) 

上面是八个SQL的奉行安顿:

2.DEPENDENT UNION与DEPENDENT SUBQUERY:

mysql> desc select * from t1 where type = 1G ************ 1. row ************ id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ref possible_keys: type key: type key_len: 4 ref: const rows: 399731 filtered: 100.00 Extra: NULL mysql> desc select * from t1 where type != 1G ************ 1. row ************ id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ref possible_keys: type key: type key_len: 4 ref: const rows: 拾1捌2filtered: 十0.00 Extra: NULL type数据布满 mysql> select type, count(*) as cnt from t1 group by type order by cnt; ------ -------- | type | cnt | ------ -------- | 2 | 38304 | | 1 | 761690 | ------ --------

当union作为子查询时,个中第二个union的select_type就是DEPENDENT UNION。
先是个子查询的select_type则是DEPENDENT SUBQUERY。

2018年8月17日,周一

  1. mysql> explain select * from t_order where order_id in (select order_id from t_order where order_id=100 union select order_id from t_order where order_id=200); 
  2. ---- -------------------- ------------ ------- --------------- --------- --------- ------- -------- -------------  
  3. | id | select_type        | table      | type  | possible_keys | key     | key_len | ref   | rows   | Extra       | 
  4. ---- -------------------- ------------ ------- --------------- --------- --------- ------- -------- -------------  
  5. |  1 | PRIMARY            | t_order    | ALL   | NULL          | NULL    | NULL    | NULL  | 100453 | Using where | 
  6. |  2 | DEPENDENT SUBQUERY | t_order    | const | PRIMARY       | PRIMARY | 4       | const |      1 | Using index | 
  7. |  3 | DEPENDENT UNION    | t_order    | const | PRIMARY       | PRIMARY | 4       | const |      1 | Using index | 
  8. | NULL | UNION RESULT       | <union2,3> | ALL   | NULL          | NULL    | NULL    | NULL  |   NULL |             | 
  9. ---- -------------------- ------------ ------- --------------- --------- --------- ------- -------- -------------  
  10. 4 rows in set (0.03 sec) 

Redis集群的slot迁移是何等达成的?

3.SUBQUERY:

答:迁移源slot设置为migrating 状态,迁移目的slot设置为importing状态。

子查询中的第三个select其select_type为SUBQUERY。

在内部用dump & restore命令,把数量迁移到对象节点,迁移截止之后,移除migrating和importing状态。

  1. mysql> explain select * from t_order where order_id=(select order_id from t_order where order_id=100); 
  2. ---- ------------- --------- ------- --------------- --------- --------- ------- ------ -------------  
  3. | id | select_type | table   | type  | possible_keys | key     | key_len | ref   | rows | Extra       | 
  4. ---- ------------- --------- ------- --------------- --------- --------- ------- ------ -------------  
  5. |  1 | PRIMARY     | t_order | const | PRIMARY       | PRIMARY | 4       | const |    1 |             | 
  6. |  2 | SUBQUERY    | t_order | const | PRIMARY       | PRIMARY | 4       |       |    1 | Using index | 
  7. ---- ------------- --------- ------- --------------- --------- --------- ------- ------ -------------  
  8. 2 rows in set (0.03 sec) 

在搬迁进程中1经有数据访问,借使数量没迁移到对象节点,那么直接回到结果,假设搬迁到目的节点,那么给客户端重回ASK重定向。

4.DERIVED:

2018年8月27日,周一

当子查询是from子句时,其select_type为DERIVED。

在大表实施ddl的经过中,若一时中断,会发出什么情况,须要特地管理吗 ?

  1. mysql> explain select * from (select order_id from t_order where order_id=100) a; 
  2. ---- ------------- ------------ -------- --------------- --------- --------- ------ ------ -------------  
  3. | id | select_type | table      | type   | possible_keys | key     | key_len | ref  | rows | Extra       | 
  4. ---- ------------- ------------ -------- --------------- --------- --------- ------ ------ -------------  
  5. |  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL |    1 |             | 
  6. |  2 | DERIVED     | t_order    | const  | PRIMARY       | PRIMARY | 4       |      |    1 | Using index | 
  7. ---- ------------- ------------ -------- --------------- --------- --------- ------ ------ -------------  
  8. 2 rows in set (0.03 sec) 

前提表达:MySQL五.柒.23、innodb表、“双壹”

二.type的说明

1、添加/删除列,采用copy的方式

1.system,const

壹.1、ctrl c。在现阶段session中,手动实施ctrl c。无影响,并且会活动删除产生的目前文件。

见上面肆.DE福特ExplorerIVED的例证。当中第2行的type便是为system,第1行是const,那二种联接类型是最快的。

壹.二、kill -玖。在实践ddl的时候,服务器产生意外宕机大概手动实行kill -九。待MySQL运维后,则会活动实行InnoDB Recovered流程。并且不会删除产生的权且文件,需求手工业管理。

2.eq_ref

版权声明:本文由365bet官网娱乐发布于关于我们,转载请注明出处:详细介绍,explain用法和结果的含义