1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MySql —— EXPLAIN 索引处理情况与查询优化

MySql —— EXPLAIN 索引处理情况与查询优化

时间:2021-06-21 21:56:19

相关推荐

MySql —— EXPLAIN 索引处理情况与查询优化

文章目录

MySql —— EXPLAIN 索引处理情况简介字段详解IDID解读 SELECT_TYPETABLETYPEPOSSIBLE_KEYSKEYKEY_LENREFROWSEXTRAUsing filesortUsing temporaryUsing indexUsing whereUsing join bufferimpossible whereselect tables optimized awaydistinct

MySql —— EXPLAIN 索引处理情况

简介

如果遇到一条SQL很慢,我们可以通过EXPLAN 命令分析SQL索引情况。

字段详解

ID

select查询的序列号,包含一组数字,表示执行select子句或操作表的顺序。

ID解读

ID相同时,顺序从上至下

上述加载顺序则是 US -> UBID不同,在子查询情况下,ID的序号会递增,ID的值越大优先级越高,越先执行:

ID出现相同时,可以认为相同ID是同一分组,从上往下顺序执行;依然ID越大,优先级越高,越先执行。

SELECT_TYPE

表示查询类型,用于区分普通查询、联合查询、自查询等查询方式。

TABLE

当前执行的表(如果起别名,显示别名)

TYPE

显示查询使用了哪种类型,type包含的类型包括如下图所示的几种:

ALL、INDEX、RANGE、REF、EQ_REF、CONST,SYSTEM、NULL

SYSTEM

表只有一行记录(等于系统表),这是CONST类型的特列,平时不出现,可以忽略不计。CONST

表示通过索引一次查找到,即是通过索引列进行查询。EQ_REF

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

非唯一性索引扫描,返回匹配某字段的所有行(例如使用了COUNT、SUM、AVG集合统计函数),本质上也是一种索引,返回所有匹配某个字段的所有行,然而,满足条件的可能为多列,所以它是属于查找和扫描的结合体。RANGE

只检索给定范围的行,使用一个索引来选择行,KEY列显示使用哪个索引,通常在WHERE后面使用BETWEEN、<、>、IN等查询时出现,属于范围型全局扫描。因为它开始于指定索引的某一点,而指定结束一边,所以不用扫描全部索引。INDEX

INDEX只遍历索引树,通常比ALL快,因为索引文件通常比数据文件小。(虽然INDEX和ALL都是读取全表,但是INDEX是通过索引读,而ALL是通过硬盘扫描所有行。)ALL

遍历全表好到匹配行,性能很低。

POSSIBLE_KEYS

POSSIBLE_KYE

显示可能应用到此表中的索引,一个或多个。查询语句中的字段如果使用了索引,会显示在这里,但不一定会被用到!!!!!

KEY

KEY

实际使用的索引,如果为NULL,则没有使用到索引。(可能是索引建立失败导致)

如果出现索引覆盖,SELECT后要查询的字段刚好和创建的索引字段相同 (名称),则该索引仅出现在KEY列中。

KEY_LEN

表示索引中使用的字节数,在不损失精度的情况下,越短越好。KEY_LEN显示的值为索引字段最大长度,并非实际长度,即,KEY_LEN根据列定义计算得出,而非检索得出。

REF

显示索引被使用的列,最好是一个常数。哪些列或常量被用于查找索引列上的值。

ROWS

根据表统计信息及索引选用情况,估算出找到所需记录要读取的行数,ROWS越小越好。

EXTRA

包含不适合在其它列中显式但十分重要的额外信息。

Using filesort

说明MySql对数据使用了一个外部的索引排序,而不是按照表内的索尼顺序进行读取。MySql中无法利用索引完成的排序操作称作“文件排序。”

EXPLAINSELECT* FROM USER USWHERE US.ID IS NOT NULLORDER BY US.REGISTER_TIME DESC;

Using temporary

使用临时表保存中间结果,MySql在对查询结果排序时使用临时表。常见于排序ORDER BY和分组查询GROUP BY。

Using index

表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。

Using where

表明使用了where过滤。

Using join buffer

表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。

impossible where

where子句的值总是false,不能用来获取任何元组

select tables optimized away

在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

distinct

优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。