Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277910
  • 博文数量: 52
  • 博客积分: 120
  • 博客等级: 民兵
  • 技术积分: 1189
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-03 15:41
个人简介

MySQL DBA

文章分类

全部博文(52)

文章存档

2013年(51)

2011年(1)

分类: Mysql/postgreSQL

2013-03-07 13:00:29

1.explain table

Explain  tb1_name -- desc / show columns from tba_name 

2.explain statement

Explain  [extended|partitions] select select_options

--显示mysql如何处理查询语句,使用extended可以用show warnings 来查看实际执行的sql(优化器优化后)。

Explain 输出信息:

Id  查询序列号

Select type  查询类型

Select type

Describle

Simple

未使用union、子查询的简单查询

Primary

联接查询中的最为外围查询

Union

Union中第二个或者后面的查询

Dependentunion

取决于外围查询的第二个或以后的查询

Union result

Union结果

Subquery

子查询中的第一个查询

Derived

导出表的查询即from子句的子查询

Table  输出行引用的表

 Type  联接类型

System      表仅有一行

     Const     表最多有一行匹配,在查询开始时读取,只读取一次,速度很快,用于使用常数值比较主键或者唯一索引 

Eq_ref        对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUEPRIMARY KEY

eq_ref        可以用于使用操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。

SELECT * FROM ref_table,other_table     WHERE ref_table.key_column=other_table.column or expr;

Ref        对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUEPRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。

Ref        可以用于使用=<=>操作符的带索引的列

ref_or_null    该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化

Index_merge     索引合并,该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素

unique_subquery    unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高

index_subquery    该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引

value IN (SELECT key_column FROM single_table WHERE some_expr)

Range        当使用=<>>>=<<=IS NULL<=>BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range。使用索引来检测关键字,只查询指定范围行

Index        完整扫描索引树,和ALL相同,比ALL快

All        全表扫描:对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。

Possible_keys

       可能使用到的索引,部分keyexplain输出的表次序不一致

Key

  实际使用的索引,在查询中可以使用force index use index ignore 来决定使用某个索引或者不使用索引

Key_len

索引长度

Ref

key一起作为条件从表中选择行的列或者常数

Rows

查询过程查询过程中的行数

   

Extra

     Distinct        MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。

Not exists    MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行

      range checked for each record (index map: #)    MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL检查是否可以使用rangeindex_merge访问方法来索取行

      Using filesort    MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行

      Using index    从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略。

     Using temporary    为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BYORDER BY子句时。

Using where    WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALLindex,查询可能会有一些错误

Using sort_union(...), Using union(...), Using intersect(...)    这些函数说明如何为index_merge联接类型合并索引扫描。

Using index for group-by    类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BYDISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

阅读(2195) | 评论(0) | 转发(0) |
0

上一篇:linux crontab 笔记

下一篇:Linux 文件传输

给主人留下些什么吧!~~