xzhuz / blog-gitment

博客备份和comment记录
https://meisen.pro
0 stars 0 forks source link

困知记 #29

Open xzhuz opened 5 years ago

xzhuz commented 5 years ago

https://meisen.pro/article/f9f3bb44-2e60-495d-9105-30b0869766f8

explain

执行下面设置,查看

explain select * from article where id='209429c5e71c40d89d4f18addc3f5f61';

执行结果 执行计划

一、 id

 我的理解是SQL执行的顺序的标识,SQL从大到小的执行
  1. id相同时,执行顺序由上至下
  2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
  3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

二、select_type

  表示查询中每个select子句的类型

三、table

显示这一行的数据是关于哪张表的,有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果) 复制代码

explain select * from (select * from (select * from normal_trade where id=1657016 ) a) b;

执行计划

四、type

表示MySQL在表中找到所需行的方式,又称“访问类型”。 常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)

system>const>eq_ref>ref>range>index>ALL 越往左边,性能越高,比如system就比ALL类型性能要高出许多 阿里Java开发手册中,推荐能够达到range级别, 最好是const或ref 使用主键索引和唯一索引的时候可以达到const的 比如,修改tb1的tb_name修改为唯一索引ux_name

explain select * from tb1 where tb_name = '测试数据测试数据111';

这里能够达到const, extra也可以达到 using index

五、possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用 该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。 如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

六、Key

key列显示MySQL实际决定使用的键(索引) 如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

七、key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的) 不损失精确性的情况下,长度越短越好

八、ref

表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

九、rows

表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

十、Extra

该列包含MySQL解决查询的详细信息,有以下几种情况:

总结:

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况 • EXPLAIN不考虑各种Cache • EXPLAIN不能显示MySQL在执行查询时所作的优化工作 • 部分统计信息是估算的,并非精确值 • EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

xzhuz commented 5 years ago

Extra中还存在下面的几种情况

using index & using where 和using index condition那个比较好,从上面的的解释中就能看出是前者比较好,毕竟不需要回表查询数据,效率上应该比较快的

https://stackoverflow.com/questions/28759576/mysql-using-index-condition-vs-using-where-using-index