或者desc获取MySQL如何执行语句的信息。
结果包含很多列
1 各列字段说明
1.1 id
标记号。它代表查询里的编号,显示查询里施行子句或操作表的次序。倘若这行涉及其他行的合集产物,那么这个数值可以没有具体内容。
id号分为三种情况:
id相同,那么执行顺序从上到下
身份各异,在子查询情形下,编号会持续增长,编号数值越大,其执行优先度越强,越早得到处理
存在具有相同编号与不同编号的个体,编号一致的视为一个整体,按照从上至下的顺序开展活动,在各个整体之间,编号数值越大的,越早启动
1.2
主要用来分辨的类型,是普通查询还是联合查询还是子查询:
(简单表,即不用表连接或子查询)
(主查询,即外部查询)
union(union中的第二个或者后面的查询语句)
(子查询中的第一个)
1.3 table
当前行正在查询哪个数据库表格,表格的名称或者其指定代号,这个表格可能是临时的,也可能是通过联合查询产生的结果集。
表示MySQL在表中找到所需行的方式,或者叫。
通常种类:全部,索引,区间,引用,常数,空值,运行速度从慢到快。
一般需要保证查询至少达到range级,最好能达到ref。
1.4.1 ALL
最直接最原始的逐行检查,MySQL依次检查所有数据行,速度最慢。
针对先前表格中的每一行组合都要进行整体检索。倘若这个表格未被标记为const,那么通常情况不佳,在其他所有情形下往往性能低下。通常,可以通过增加索引来防止使用ALL,这些索引能够依据早期表格中的固定数值或列值从表格中获取数据。
1.4.2 index
连接类型与ALL相同,除了扫描索引树外。这发生于两种方式:
当索引作为查询的完全索引时,它能提供表中所有必要的数据,因此只需遍历索引树即可。
当前情形下,列表呈现出来,单纯依靠索引检索通常比全面扫描要迅速,毕竟索引的体量一般要小于表格中的数据。
通过索引进行数据检索时,系统会执行完整的数据表遍历,目的是依照索引的排列顺序来定位相关记录。在输出结果中,将省略Extra这一字段的信息。
查询若仅涉及某个索引的部分列,MySQL便能选用这种连接方式。
1.4.3 range
通过索引检索行,仅获取指定区间的行数据。输出行会显示所使用的索引名称。其中包含索引最长的键字段部分。这种字段类型属于特定类别。
当使用 =, , >, >=,
索引范围扫描,常见=,
1.4.4
这种连接方式与前者相似,它能够取代子查询,不过只对包含非唯一索引的子查询结构有效。
1.4.5
此类型将替换为以下形式的某些IN子查询:
只是一个索引查找函数,可以完全替换子查询以提高效率。
1.4.6
这种连接方式表明会运用索引合并来提升效率,输出行里的键字段会展示所采纳的索引,并且列出这些索引中最长的键字段,具体包含哪些字段。
1.4.7
这种关联方式与ref类似,不过MySQL会另外检索含有空值的记录。这种关联方式最常用于分析嵌套查询。举例来说,MySQL能够借助这种方式来处理某些情况:
1.4.8
使用索引执行连接。
1.4.9 ref
针对先前表格中的每一组行,都会从该表格中找出索引值相同的那部分所有行。
当关联仅依赖字段的前缀部分,或者该字段既非主键也非唯一索引(即关联无法通过字段值精确匹配单行)时,会采用ref方式处理
如果使用的键仅匹配几行,则这是一种很好的联接类型。
ref可用于借助等于号或叉号进行对比的索引字段,在后面这些情形里,MySQL能应用ref连接来操作:
1.4.10
从上一张表格中的每一组数据,都到这张表格里取一条记录来对应,这种关联方式除开跟常量类型比较,算是相当理想的匹配方法。
若将索引的所有相关部分连接起来,并且该索引是主键或非空索引,那么就会采用这个索引。
这种索引与参考索引不同之处在于,它采用的是单一索引,每个索引键值对应表中的一条唯一记录。
基本上就是通过 key 或者 index 来实现多个表格的关联匹配。
适合配合等号进行对比的列可以选用此索引列,对比的数值既可以是固定值,也可以是借助先前已获取的表中字段计算得出的值,比如在以下例子里,MySQL能够通过关联操作来处理
1.4.11 const
表中最多仅能找到一条符合条件的数据,这条数据会在查询启动时被获取。由于只有单条数据,查询优化器可以将该数据列中的信息当作固定值来处理。常量表查询速度极快,原因是相关数据只会被访问一次。
对 KEY 或索引的各个组成部分,若要和固定值进行比对,就采用 const。在接下来的查询里,它能够充当 const 表。
1.4.12
该表只有一行(系统表)。这是const 连接类型的特例。
type null,MySQL不用访问数据库直接得到结果。
1.5
此次查询中可能选用的索引
1.6 key
此次查询中确切使用到的索引
1.7 ref
哪个字段或常数与 key 一起被使用
1.8 rows
此查询一共扫描了多少行,这个是一个估计值,不准确。
1.9
此查询条件所过滤的数据的百分比
1.10 extra
额外的信息。
using
借助工具检测MySQL能否借助索引处理排序需求,具体步骤如下:
输出的Extra列若无Using字样,则依据索引操作,且无需对文件进行排列
当Extra栏标明正在按文件排序时,就放弃索引,转而对整个文件进行排序操作
无法判断排序操作是否在内存中进行,通过分析优化过程的跟踪信息,可以识别内存排序的使用情况,具体查找即可。
using
建立临时表保存中间结果,查询完成之后把临时表剧除
using index
当前查询命中了索引,直接从索引中获取数据,无需去数据表查找。
倘若阿时显现 which,意味着索引正用于检索索引键值。
如果没有,表示索引被用来读取数据,而不是真的查找
using where
使用where进行条件过滤
using join
使用连接缓存
where
where语句的结果总是false
no row in const table
对于关联查询,会出现空表的情况,或者存在不满足唯一索引标准的行构成的表。
其实还有很多,不再过多描述。
MySQL 4.1 新增指令,借助 show 语句能够查询到 MySQL 在执行前优化器实际采取的措施
通过字段可以了解,会排除部分始终成立的条件,能够借助所得信息快速得到一个更加简明易懂的sql语句。
2 show
展示和展示指令提供摘要信息,这些信息表明在当前对话期间运行的指令所消耗的资源状况。
展示和展示指令现已过时,在未来的MySQL版本中将不再支持,需改为使用性能模式,这里仅做简要说明,大家了解即可。
查看是否开启
可见,默认是关闭的。
可通过set语句在级别启动:
可查看执行过程中每个线程的状态和耗时。
那个状态意味着MySQL线程开始读取数据行,然后把结果发给客户方,并且不只是发给客户方,因为当MySQL线程处于 data 状态时,它通常需要执行许多磁盘读取动作,因此,这往往是整个查询过程中最耗费时间的阶段。
能够挑选全部,中央处理器,区块输入输出,页面等具体项目,用以判别MySQL在哪些资源上消耗了过多时长,比如,选定审视中央处理器的耗时情况
对比过程,也实施统计记录总数操作,进行查验,该表已处于数据状态,而另一表完全无需查询数据
若想探究MySQL的内部运作机制,可借助show for query功能,逐个环节审视sql解析执行过程中的每一步,并找到对应的源代码文件
3 trace分析优化器
MySQL 5.6版本具备相应功能,借助追踪文档,可以深入探究优化器的决策过程,从而更清晰地掌握优化器的运作方式。
使用方式
启动追踪功能,将输出格式设定为JSON格式,设定追踪功能可调用的最大内存容量,以防解析阶段因预设内存量不足而无法完整展示内容
接下来执行trace的sql语句
最后检查.就可以知道Mysql如何执行sql
参考
往期推荐
因为会MySQL分库分表,领导给我升职了
还不会MySQL临时表应用?可能错过大厂offer
MySQL数据库设计三范式
听说你还不懂 Java 的服务定位器模式( )?
点个在看,你最好看
扫一扫在手机端查看
-
Tags : 陕西ref or null
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1