explain命令

本文详细解读了Mysql Explain命令的作用,包括其参数解释,如查询序列号、查询类型和索引使用情况。同时介绍了如何通过showprofile分析SQL执行时间,提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是explain

explain是MySql中用来分析SQL语句执行效率的一条命令,通过explain命令我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。

explain各参数解析

id

select查询的序列号包含一组数字,表示查询中执行select子句或者操作表的顺序

  • id相同,执行顺序由上至下
  • id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先执行
  • id有相同的也有不同的,则相同的看为一组再继续按照上面两条规则执行

select_type

  • SIMPLE:简单的select查询,查询中不包含子查询或者UNION
  • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为
  • SUBQUER: 在select或者where列表中包含了子查询
  • DERIVED:在from列表中包含的子查询被标记为DERIVED(衍生)MySql会递归执行这些子查询,把结果放在临时表
  • UNION:若第二个select出现在union之后,则被标记为UNION,若union包含在from子句的子查询中,外层select被标记为:DERIVED
  • UNION RESULT:从union表获取结果的select

type

访问类型

  • all:全表扫描
  • index:全索引扫描
  • range:范围扫描
  • ref:不唯一的索引扫描,有多个符合条件的行
  • eq_ref:唯一的索引扫描,只有一条记录与之匹配,常见于主键索引
  • const、system:这两种的情况都比较好,前一种值的是条件为常量
  • null:执行阶段不需要访问的表

table

表面对应查询访问的表

possible_keys

可能用到的索引

key

实际用到的索引

key_len

在索引里面使用的字节数

ref

这一列显示了哪些字段或者常量被用来和key配合从表中查询记录出来

rows

估计要读取的行数

extra

  • Using index:使用覆盖索引,表示查询索引就可查到所需数据,不用扫描表数据文件,往往说明性能不错。
  • Using Where:在存储引擎检索行后再进行过滤,使用了where从句来限制哪些行将与下一张表匹配或者是返回给用户。
  • Using temporary:在查询结果排序时会使用一个临时表,一般出现于排序、分组和多表 join 的情况,查询效率不高,建议优化。
  • Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。

其他的SQL效率分析方式

使用show profile命令可以显示sql各阶段的执行时间,便于分析影响sql效率的原因。

<think>我们正在讨论的是SinoDB(原Informix)数据库,它没有EXPLAIN命令。需要提供替代方案来判断SQL语句是否使用了索引。 替代方法: 1. 使用SET EXPLAIN ON:在SinoDB中,可以通过设置会话级别的SET EXPLAIN ON来生成查询计划,然后执行SQL,系统会将执行计划输出到指定文件中(默认为sqexplain.out)。 2. 查看查询计划:生成的查询计划文件中会详细说明每一步操作,包括是否使用了索引。 3. 使用onstat命令:通过onstat -g命令可以查看当前查询的执行计划(需要相应权限)。 具体步骤示例: ```sql SET EXPLAIN ON; SELECT * FROM table_name WHERE condition; -- 执行后,在sqexplain.out文件中查看执行计划 ``` 在查询计划中,如果看到类似“INDEX PATH”或“INDEX”等关键词,表示使用了索引;如果看到“SEQUENTIAL SCAN”则表示全表扫描。 另外,还可以使用SinoDB的图形化管理工具(如dbaccess或OAT)来查看执行计划。 注意:SinoDB的查询计划需要分析执行步骤,判断是否使用了索引。 因此,虽然没有EXPLAIN命令,但有替代方案。</think>在SinoDB(原Informix)数据库中,虽然没有标准的`EXPLAIN`命令,但可以通过以下替代方法判断SQL语句是否使用索引: ### 1. **使用`SET EXPLAIN`命令** ```sql SET EXPLAIN ON; -- 开启执行计划输出 SELECT ... ; -- 执行你的查询 SET EXPLAIN OFF; -- 关闭输出 ``` - 执行后会在**当前目录生成`sqexplain.out`文件**,内容包含: - `QUERY`:原始SQL语句 - `ACCESS PLAN`:显示`INDEX PATH`(使用索引)或`SEQUENTIAL SCAN`(全表扫描) - 索引名称和扫描方式(如`INDEX (btree_index_name)`) ### 2. **通过系统表分析** 查询`sysindexes`和`sysfragments`系统表: ```sql SELECT tabname, idxname, idxtype FROM sysindexes WHERE tabname = 'your_table'; ``` 结合`oncheck -pt`命令查看表碎片信息,索引使用率高的表更可能被优化器选择。 ### 3. **性能监控工具** - 使用`onstat -g sql`查看当前SQL执行状态 - 通过`onstat -p`监控`diskreads`(物理读)与`buffreads`(缓冲读)比例: - 索引有效时`diskreads/buffreads`比值较低 - 全表扫描时比值显著上升 ### 4. **图形化工具** - 使用**dbaccess**或**OAT(OpenAdmin Tool)** 的查询分析功能 - 第三方工具如**Aqua Data Studio**支持SinoDB执行计划可视化 > ⚠️ 注意:SinoDB优化器可能因统计信息过期(`UPDATE STATISTICS`未执行)而忽略索引,需定期维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值