myql explain

explain关键字

id: 查询的序列号,执行select子查询或者操作表的顺序

select_type:查询的类型

table:数据来自于哪张表

partitions:数据来自哪个分区

type:访问的类型

possible_keys:查询可能使用到哪些索引

key:查询实际使用到的索引

key_len:索引中使用的字节数

ref:索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值

rows:通过统计信息或者索引选择预估扫描的行数

filtered:查下结果的行数占表的百分比

extral:包含不适合在其他列展示但是又十分重要的信息

 

表结构如下:

CREATE TABLE `prime_user_group_detail` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键 id',
  `group_id` bigint(20) NOT NULL COMMENT '组 id ',
  `identifier` varchar(128) CHARACTER SET utf8 NOT NULL COMMENT '标识符',
  `create_by` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '创建者',
  `update_by` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '更新人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `version` int(10) DEFAULT NULL COMMENT '乐观版本号',
  `extra` varchar(128) CHARACTER SET utf8 DEFAULT NULL COMMENT '预留扩展字段 ',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_group_identifier` (`group_id`,`identifier`),
  KEY `idx_update_time_group_id` (`update_time`,`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3046853 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

  • 【Id列】:
    • 查询的序列号,执行select子查询或者操作表的顺序
      • id相同:从上往下执行
      • id不相同:id值越大,优先级越高,越先被执行
      • id列的值为NULL:最后执行
  • 【select_type列】:
    • 查询的类型
      • SIMPLE:表明当前行对应的select为简单查询,不包含子查询和union
      • PRIMARY:表明当前行对应的查询是复杂查询中的最外层的select
      • SUBQUERY:表明当前行对应的查询是在select中的子查询(不包含在from子句中)
      • DERIVED:表明当前行对应的select是在from子句中的子查询
      • UNION:表明当前行对应的select是在union中的第二个或者随后的select
      • UNION RESULT:表明当前行对应的select是union表结果的select
  • 【table列】:
    • 数据来自于哪张表
  • 【type列】:
    • null:MySQL优化器在优化阶段分解查询语句,在优化过程中就已经可以得到结果,那么在执行阶段就不用再访问表或索引。
    • system:表中只有一行记录(相当于系统表)。这是const类型的特例,可以忽略.此时可以用explain extended+show warnings查看执行结
    • const:出现在用 primary key(主键) 或 unique key(唯一键) 的 所有列与常数比较时,优化器对查询进行优化并将其部分查询转化成一个常量.最多有一个匹配行,读取1次,速度非常快
    • eq_ref:唯一性扫描,对于每个索引键,表中只有一条数据行与之匹配.常见于主键索引和唯一性索引
    • ref:非唯一性索引扫描,返回匹配索引单个值对应的一个或多个行,属于查找和扫描的混合体.与eq_ref相比,ref类型不是使用primary key(主键) 或 unique key(唯一键)等唯一索引,而是使用普通索引或者联合唯一性索引的部分前缀,索引和某个值相比较,可能会找到符合条件的多个数据行
    • ref_or_null:类似ref,但是可以搜索值为null的行
    • index_merge:使用了索引合并的优化方案
    • range:使用一个索引检索给定范围的行.一般是where子句中出现 in,between ,> ,= 等查询。这种查询比全索引扫描要好,因为只要开始于索引的某一点,结束于另一点,不需要全索引扫描
    • index:Full index scan,index与ALL区别,index只遍历索引树,通常比ALL快.因为索引文件通常比数据文件小(虽然index和ALL都是读全表,但是index是从索引读取,而ALL是从硬盘读取)
    • ALL:Full table scan,遍历全表以找到匹配行 
  • possible_keys:这一列的结果表明查询可能使用到哪些索引。有时候会出现possible_keys 列有结果,而 后面的key列显示 null 的情况,这是因为此时表中数据不多,优化器认为查询索引对查询帮助不大,所以没有走索引查询而是进行了全表扫描。如果possible_keys列的结果是null,则表明没有相关的索引。这时,可以通过优化where子句,增加恰当的索引来提升查询性能。
  • 【key列】:优化器实际采用哪个索引来优化对该表的查询。如果没有使用索引,则该列是 null
  • 【key_len列】:表示索引中使用的字节数,可以通过该列计算查询中使用索引的长度.再不损失精度的情况下,长度越短越好.key_len的值为索引字段可能的最大长度,并非实际长度.即key_len是根据表定义计算而得,不是通过表内检索而得.
  • 【ref列】:显示key列索引中的那一列被使用了,可能是一个常数、列字段名.被用于查找索引列上的值.
  • 【rows列】:根据表统计信息或者索引选用情况,大致估算查找所需记录需要扫描的行数.
  • 【partitions】:匹配的分区
  • 【filtered】:查询的表行占表的白分比
  • 【extra】:包含不适合在其他列中显示的但十分重要的信息
    • using index:所有被查询的字段都包含在索引列中(称为覆盖索引).如果where条件是索引的前导列,出现这样的结果,是性能高的表现。
    • using where:被查询的列未被索引覆盖,where条件也并非索引的前导列,表示 MySQL 执行器从存储引擎接收到查询数据,再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃
    • using where Using index:被查询的列被索引覆盖,并且where条件是索引列之一但不是索引的前导列,也就是没有办法直接通过索引来查询到符合条件的数据
    • null:被查询的列没有被索引覆盖,但where条件是索引的前导列,此时用到了索引,但是部分列未被索引覆盖,必须通过“回表查询”来实现,不是纯粹地用到了索引,也不是完全没用到索引
    • using index condition:与using where类似,查询的列不完全被索引覆盖,where条件中是一个前导列的范围;这种情况未能通过示例显现,可能跟MySQL版本有关系。
    • using temporary:这表明需要通过创建临时表来处理查询。出现这种情况一般是要进行优化的,用索引来优化。创建临时表的情况:distinct,group by,orderby,子查询等
    • using filesort:在使用order by的情况下出现,mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下要考虑使用索引来优化的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值