什么是MySQL的执行计划(Explain关键字)?
什么是ExplainExplain被称为执行计划 , 在语句之前增加 explain 关键字 , MySQL 会在查询上设置一个标记 , 模拟MySQL优化器来执行SQL语句 , 执行查询时 , 会返回执行计划的信息 , 并不执行这条SQL 。 (注意 , 如果 from 中包含子查询 , 仍会执行该子查询 , 将结果放入临时表中) 。
Explain可以用来分析SQL语句和表结构的性能瓶颈 。 通过explain的结果 , 可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息 。
Explain命令扩展explain extended在explain的基础上提供一些额外的查询信息 , 在explian extended执行以后 , 通过show warnings命令可以得到优化后的查询语句 , 可以看出优化器做了哪些工作 , 还可以通过某些数据估算表连接的行数 。
explain partitions用于分析使用了分区的表 , 会显示出可能用到的分区 。
两点重要提示1. Explain结果是基于数据表中现有数据的 。 2. Explain结果与MySQL版本有很大的关系 , 不同版本的优化器的优化策略不同 。 本文示例使用的数据库表
文章插图
Explain命令(关键字)explain简单示例mysql>explain select * from t_user;
文章插图
在查询中的每个”表”会输出一行 , 这里的“表”的意义非常广泛 , 不仅仅是数据库表 , 还可以是子查询、一个union 结果等 。
explain结果列说明【id列】id列是一个有顺序的编号 , 是查询的顺序号 , 有几个 select 就显示几行 。 id的顺序是按 select 出现的顺序增长的 。 id列的值越大执行优先级越高越先执行 , id列的值相同则从上往下执行 , id列的值为NULL最后执行 。
【select_type列】select_type列的值标明查询的类型:
1)simple:表明当前行对应的select是简单查询 , 不包含子查询和union
2)primary:表明当前行对应的select是复杂查询中最外层的 select
3)subquery:表明当前行对应的select是包含在 select 中的子查询(不在 from 子句中)
4)derived:表明当前行对应的select是包含在 from 子句中的子查询 。
MySQL会创建一个临时表来存放子查询的查询结果 。 用如下的语句示例说明:
explain select (select 1 fromt_user where user_id=1) from (select * from t_group where group_id=1) tmp;
文章插图
*注意 , 在资料收集过程中 , 发现不同版本的MySQL表现不一致 , 经反复对比 , 5.7及以后版本的输出如下:
文章插图
很显然 , MySQL在这方面进行了优化.
*注意 , MySQL不同版本Explain表现差异很大 , 有些场景 , 从语句层面看 , 是要使用到索引 , 但经过优化器分析 , 结合表中现有数据 , 如果MySQL认为全表扫描性能更优 , 则会使用全表扫描 。
5)union:表明当前行对应的select是在 union 中的第二个和随后的 select
6)union result:表明当前行对应的select是从 union 临时表检索结果的 select
explain select 1 union all select 2 fromdual;
文章插图
MySQL5.7及以后同样做了优化
文章插图
- vivo追求的本原设计是什么?X60 Pro给出了答案
- iQOO 7邀请函曝光“马”“鸭”“羊”代表什么
- 近期浙江引来这么多重磅级“帮手”传递什么信号?
- 都是为自己手机代言,为什么董明珠不行,雷军太行了?
- 有没有必要给老年人买台智能手机?
- 玩转光追大作最低需要什么配置?快来看小狮子的推荐
- realme国潮锦鲤手机为什么叫V15?徐起解释命名规则
- 九千元买的手机,最基本的功能都不好用,男子:还能干什么?
- 为什么苹果用户哪怕买二手机,都不用安卓?三点原因太真实
- 「小狮子诊所」游戏耳机和音乐耳机究竟有什么区别?