专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  如何实现一个合格的分布式锁 ·  9 小时前  
芋道源码  ·  高性能、无侵入的 Java 性能监控神器 ·  2 天前  
芋道源码  ·  Java面试,问八股文的面试官水平很次? ·  2 天前  
Java编程精选  ·  阿里员工吐槽:80%以上的leader认为, ... ·  5 天前  
51好读  ›  专栏  ›  芋道源码

SQL性能优化神器!

芋道源码  · 公众号  · Java  · 2025-06-01 18:18

主要观点总结

本文介绍了MySQL中慢查询的监控和优化方法,包括使用explain关键字进行SQL查询优化。

关键观点总结

关键观点1: 介绍explain的用途和功能

explain用于查看SQL查询的执行计划,帮助识别和解决慢查询问题。

关键观点2: explain各列的含义和重要性

重点介绍id、select_type、type、possible_keys、key、key_len、ref、rows、filtered和Extra等列的含义和它们在索引优化中的重要作用。

关键观点3: 索引优化的步骤和方法

先使用慢查询日志定位需要优化的SQL,然后使用explain执行计划查看索引使用情况,根据结果优化SQL。

关键观点4: 项目实例和源码解析

提供基于Spring Cloud Alibaba的后台管理系统实例,包括动态权限、多租户等功能,强调源码解析和学习路线。

关键观点5: 知识星球的介绍和加入方式

邀请读者加入作者的知识星球,获取更多技术提升和资源分享,包括项目实战、面试招聘等内容。


正文

请到「今天看啥」查看全文


explain详解

explain的语法:

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FORCONNECTION connection_id}

explain_type: {
    EXTENDED
  | PARTITIONS
  | FORMAT = format_name
}

format_name: {
    TRADITIONAL
  | JSON
}

explainable_stmt: {
    SELECTstatement
  | DELETEstatement
  | INSERTstatement
  | REPLACEstatement
  | UPDATEstatement
}

用一条简单的sql看看使用 explain 关键字的效果:

explain select * from test1;

执行结果: 从上图中看到执行结果中会显示12列信息,每列具体信息如下:

说白了,我们要搞懂这些列的具体含义才能正常判断索引的使用情况。

话不多说,直接开始介绍吧。

id列

该列的值是select查询中的序号,比如:1、2、3、4等,它决定了表的执行顺序。

某条sql的执行计划中一般会出现三种情况:

  1. id相同
  2. id不同
  3. id相同和不同都有

那么这三种情况表的执行顺序是怎么样的呢?

1.id相同

执行sql如下:

explain select * from test1 t1 inner join test1 t2 on t1.id=t2.id

结果: 我们看到执行结果中的两条数据id都是1,是相同的。

这种情况表的执行顺序是怎么样的呢?

答案:从上到下执行,先执行表t1,再执行表t2。

执行的表要怎么看呢?

答案:看table字段,这个字段后面会详细解释。

2.id不同

执行sql如下:

explain select * from test1 t1 where t1.id = (select id from  test1 t2 where  t2.id=2);

结果: 我们看到执行结果中两条数据的id不同,第一条数据是1,第二条数据是2。

这种情况表的执行顺序是怎么样的呢?

答案:序号大的先执行,这里会从下到上执行,先执行表t2,再执行表t1。

3.id相同和不同都有

执行sql如下:

explain
select t1.* from test1 t1
inner join (select max(idmid from test1 group by id) t2
on t1.id=t2.mid

结果:

我们看到执行结果中三条数据,前面两条数据的的id相同,第三条数据的id跟前面的不同。

这种情况表的执行顺序又是怎么样的呢?

答案:先执行序号大的,先从下而上执行。遇到序号相同时,再从上而下执行。所以这个列子中表的顺序顺序是:test1、t1、

也许你会在这里心生疑问: 是什么鬼?

它表示派生表,别急后面会讲的。

还有一个问题:id列的值允许为空吗?

答案在后面揭晓。

select_type列

该列表示select的类型。具体包含了如下11种类型:

但是常用的其实就是下面几个:

类型
含义
SIMPLE
简单SELECT查询,不包含子查询和UNION
PRIMARY
复杂查询中的最外层查询,表示主要的查询
SUBQUERY
SELECT或WHERE列表中包含了子查询
DERIVED
FROM列表中包含的子查询,即衍生
UNION
UNION关键字之后的查询
UNION RESULT
从UNION后的表获取结果集

下面看看这些SELECT类型具体是怎么出现的:

SIMPLE

执行sql如下:

explain select * from test1;

结果:

它只在简单SELECT查询中出现,不包含子查询和UNION,这种类型比较直观就不多说了。

PRIMARY 和 SUBQUERY

执行sql如下:







请到「今天看啥」查看全文