分类: Mysql/postgreSQL
2015-02-28 21:24:34
Column
Meaning
id [948]
该SELECT标识符 select_type [949]
SELECT 类型 table [949]
表对输出行 partitions [949]
匹配分区 type [949]
join类型 possible_keys [950]
可能的索引选择 key [950]
索引实际选择 key_len [950]
所选键的长度 ref [950]
相比于索引的列 rows [950]
估计要检查的行 filtered [950]
行的百分比由过滤条件表 Extra [951 ]
附加信息
SELECT标识符。SELECT在查询中的顺序号。该值可以是NULL,如果该行是指其他行的union的结果。在这种情况下,该表列显示像以指示该行是指行的union与M和N的ID值的值。
SELECT的类型,它可以是下表中所示的任何的。
select_type Value
Meaning
SIMPLE
简单的SELECT(不使用UNION或子查询) PRIMARY
最外层的SELECT UNION
在UNION中第二或更更后的SELECT语句 DEPENDENT UNION
在UNION中第二个或后面的SELECT语句,依赖于外部查询。 UNION RESULT
一个UNION的结果。 SUBQUERY
在子查询中的第一个SELECT DEPENDENT SUBQUERY
在子查询中的第一个SELECT,依赖于外部查询 DERIVED
派生表SELECT(在FROM子句中的子查询) MATERIALIZED
物化子查询 UNCACHEABLE
SUBQUERY
对于该结果不能被缓存并且必须重新评估外部查询的每一行的子查询。 UNCACHEABLE UNION
第二个或者最面一个属于一个不可缓存的子查询在UNION中(见UNCACHEABLE SUBQUERY)
向其中输出的行是指该表的名称。这也可以是以下值之一:
M, N> : 该行是指行的联合与M和N的ID值。N> : 该行指的是派生表结果行用N的ID值。派生表可能导致,例如,从一个子查询在FROM子句。N> :行是指一种物化子查询的行的结果用N的值标识。详见,Section 8.13.16.2, “Optimizing Subqueries with Subquery Materialization”。
分区从该记录将被查询相匹配。显示此列仅在使用PARTITIONS关键字。该值为NULL对于非分区表。详见,Section 17.3.5,“Obtaining Information About Partitions”。
join类型。对于不同类型的描述,详见,EXPLAIN Join Types。
possible_keys列指出哪些索引MySQL能够从使用选择找到此表中的行。注意,作为显示在由EXPLAIN输出该列是完全独立的表的顺序。这意味着,在一些possible_keys的键可能无法在实践中与所生成的表的顺序使用。
如果该值为NULL,有没有相关的索引。在这种情况下,您可以通过检查WHERE子句来检查它是否是指一些列或多列,这将是适合索引以改善查询性能。如果是这样,创建一个适当的索引和查询再次用EXPLAIN。详见,Section 13.1.6, “ALTER TABLE Syntax”。
看到一个表有什么索引,使用SHOW INDEX FROM tbl_name。
键列指示键(索引),MySQL的实际决定使用。如果MySQL决定使用possible_keys索引中的一个来查找的行,该索引列为键值。
这是可能的键将命名一个索引中不存在该possible_keys值。
该key_len列指出MySQL决定使用的密钥的长度。长度为NULL如果键列表示NULL。
ref列显示哪个列或常量比较键列命名的索引从表中选择行。
该行列显示MySQL的相信它必须检验以执行查询的行数。
对于InnoDB表,这个数量是一个估计值,并且可能不总是准确。
过滤后的列指示的表中的行的估计百分比将由表条件进行过滤。也就是说,行显示检查的行估计数目和rows × filtered / 100 示出了将与前面的表中被join的行数。如果使用EXPLAIN EXTENDED这个列显示。
这列包含MySQL解决查询的额外信息。为不同的值的说明,详见,EXPLAIN Extra Information。
表只有一行(=系统表)。这是const[951]联接类型的一个特例。
表中有至多一个匹配行,这是读取在查询的开始。因为仅存在一个行,从该行中的列的值可以通过优化的其余部分被视为常数。const[951]表非常快,因为它们只读取一次。
const的[951]当你比较PRIMARY KEY或UNIQUE索引常量的所有部分被使用。在下面的查询,tbl_name可以用作一个const[951]表:SELECT * FROM tbl_name WHERE primary_key=1;
SELECT * FROM tbl_name
WHERE primary_key_part1=1 AND primary_key_part2=2;
一行从该表中读出用于从前面的表中的行的每一种组合。
SELECT * FROM ref_table,other_tableWHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_tableWHERE ref_table.key_column_part1=other_table.columnAND ref_table.key_column_part2=1;
相匹配的索引值的所有行从该表中读取来自于先前的表行的每个组合。
SELECT * FROM ref_tableWHERE key_column=expr;
SELECT * FROM ref_table,other_tableWHERE ref_table.key_column=other_table.column;SELECT * FROM ref_table,other_tableWHERE ref_table.key_column_part1=other_table.columnAND ref_table.key_column_part2=1;
联接使用FULLTEXT索引执行。
类似ref[951],但是与MySQL的确实为包含NULL值的行额外的搜索增加。
SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL;
该join类型指示索引合并优化使用。
这种类型的替代ref[951]对于一些在下面的表单子查询:
value IN (SELECT primary_keyFROM single_tableWHERE some_expr)
此连接类型类似于unique_subquery[952]。value IN (SELECT key_columnFROM single_tableWHERE some_expr)
仅是在给定的范围内的行检索,利用一个索引来选择行。范围[952]可以在一个键列相比于恒定被使用使用任何= [1233],<>[1234],> [1234],> =[1234],<[1234]<=〔1234],IS NULL[1235]<=>[1234],BETWEEN[1235],或IN()[1236]运算符:
SELECT * FROM tbl_nameWHERE key_column= 10;
SELECT * FROM tbl_nameWHERE key_columnBETWEEN 10 and 20;
SELECT * FROM tbl_nameWHERE key_columnIN (10,20,30);
SELECT * FROM tbl_nameWHERE key_part1= 10 AND key_part2IN (10,20,30);
索引join 类型是类似ALL,除了使用索引树被扫描。发生这种情况有两种方法:
- 如果该索引是用于查询覆盖索引并且可以用来满足从所述表中所要求的所有的数据,仅索引树被扫描。在这种情况下,Extra的列表示Using index。
- 使用进行全表扫描从索引读取查找数据行的索引顺序。Uses index 没有出现在Extra列。
MySQL能使用这种连接类型时查询使用仅是单个索引的一部分列。
对于一个查询,如SELECT... FROM tbl_name,该表是空的。
EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
tt.ProjectReference, tt.EstimatedShipDate,tt.ActualShipDate, tt.ClientID,tt.ServiceCodes, tt.RepetitiveID,tt.CurrentProcess, tt.CurrentDPPerson,tt.RecordVolume, tt.DPPrinted, et.COUNTRY,et_1.COUNTRY, do.CUSTNAME
FROM tt, et, et AS et_1, do
WHERE tt.SubmitTime IS NULL
AND tt.ActualPC = et.EMPLOYIDAND tt.AssignedPC = et_1.EMPLOYIDAND tt.ClientID = do.CUSTNMBR;
Table
|
Column
|
Data Type
|
tt
|
ActualPC
|
CHAR(10)
|
tt
|
AssignedPC
|
CHAR(10)
|
tt
|
ClientID
|
CHAR(10)
|
et
|
EMPLOYID
|
CHAR(15)
|
do
|
CUSTNMBR
|
CHAR(15)
|
Table
|
Index
|
tt
|
ActualPC
|
tt
|
AssignedPC
|
tt
|
ClientID
|
et
|
EMPLOYID(primary key)
|
do
|
CUSTNMBR(primary key)
|
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),-> MODIFY ClientID VARCHAR(15);
mysql> ANALYZE TABLE tt;