Explain
MySql提供了Explain
命令,它可以对你的sql语句进行分析,返回你的sql执行的详细信息,以供开发人员针对性进行优化
。
我们可以查看该sql是否使用索引、是否做全表扫描、性能瓶颈、执行的效率怎么样…等等
EXPLAIN介绍
EXPLAIN 指令提供了 MySQL 如何执行一条 SQL 语句的信息。通过使用 EXPLAIN,我们可以查看 SQL 语句的执行方式,进而排查 SQL 语句的瓶颈,然后进行优化。
Explain语法
Explain [ select语句 ]
示例
- 例如分析一条select语句
我是用的Navicat软件运行的sql语句,explain 出来的信息有12列,下面我会列出来我常用到的:
select_type
查询过程中,每个select句子的类型
Simple
简单select,不使用union或子查询等Primary
查当存在子查询时,最外层的select永远被标记为Primary主查询Union
union中第二个语句或后面的select语句Dependent Union
union中第二个语句或后面的select语句,独立于外部查询Union Result
Union结果,连接几个表查询后的结果SubQuery
子查询中的第一个selectDependent SubQuery
子查询中的第一个select,取决于外面的查询Derived
子查询在from子句中,MySql会把结果放在临时表中Uncacheable SubQuery
一个子查询的结果不能被缓存,必须重新评估外链接的第一行- …
type
常见的扫描方式
扫描方式由快到慢: System > Const > eq_ref > ref > range > index > All
System
系统表,少量数据(mysql服务启动时已加载在内存中,不需要进行磁盘IO)Const
常量连接(最多之返回一行数据,速度快)eq_ref
主表索引 或 非空唯一索引 等值扫描ref
非主键非唯一索引(普通非唯一) 等值扫描range
范围扫描(索引上范围查询,在索引上扫码特定范围的值)index
索引树扫描(扫描索引上全部数据,仅比All扫描快一点)All
全表扫描(如果id不建索引,则全表扫描)
rows
表示MySQL根据表统计信息及索引选用情况,估算找到结果集 需要扫描读取数据的行数。
- 原则上,rows越少越好
- 被扫描的行数,该数值越大,意味着需要扫描的行数,相应的耗时更长。
需要注意的是,输出的rows只是一个估算值,不能完全对其百分百相信
推荐内容
- MySql . Group_Concat 函数
将一个分组中的指定元素(列或表达式)的值,拼接成一个字符串返回。
- MySql . Concat_WS()函数
通过分隔符,将2个及多个字段元素顺序拼接在一起,返回拼接后的字符串。
- MySql . Field()函数
返回一个指定的值 在给定的列表中的 索引(排序、数据优先级)。
- MySql . CEIL()函数
- 返回大于或等于制定数字的最小整数值。sql取余数…
- MySql . ROW_NUMBER()函数
- 返回的结果集中的每一行 生成一个序列号(为行分配序号)…