主要观点总结
本文介绍了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列信息,每列具体信息如下:
说白了,我们要搞懂这些列的具体含义才能正常判断索引的使用情况。
话不多说,直接开始介绍吧。
该列的值是select查询中的序号,比如:1、2、3、4等,它决定了表的执行顺序。
某条sql的执行计划中一般会出现三种情况:
-
-
-
那么这三种情况表的执行顺序是怎么样的呢?
执行sql如下:
explain select * from test1 t1 inner join test1 t2 on t1.id=t2.id
结果:
我们看到执行结果中的两条数据id都是1,是相同的。
这种情况表的执行顺序是怎么样的呢?
答案:从上到下执行,先执行表t1,再执行表t2。
执行的表要怎么看呢?
答案:看table字段,这个字段后面会详细解释。
执行sql如下:
explain select * from test1 t1 where t1.id = (select id from test1 t2 where t2.id=2);
结果:
我们看到执行结果中两条数据的id不同,第一条数据是1,第二条数据是2。
这种情况表的执行顺序是怎么样的呢?
答案:序号大的先执行,这里会从下到上执行,先执行表t2,再执行表t1。
执行sql如下:
explain
select t1.* from test1 t1
inner join (select max(id) mid from test1 group by id) t2
on t1.id=t2.mid
结果:
我们看到执行结果中三条数据,前面两条数据的的id相同,第三条数据的id跟前面的不同。
这种情况表的执行顺序又是怎么样的呢?
答案:先执行序号大的,先从下而上执行。遇到序号相同时,再从上而下执行。所以这个列子中表的顺序顺序是:test1、t1、
也许你会在这里心生疑问:
是什么鬼?
它表示派生表,别急后面会讲的。
还有一个问题:id列的值允许为空吗?
答案在后面揭晓。
该列表示select的类型。具体包含了如下11种类型:
但是常用的其实就是下面几个:
下面看看这些SELECT类型具体是怎么出现的:
执行sql如下:
explain select * from test1;
结果:
它只在简单SELECT查询中出现,不包含子查询和UNION,这种类型比较直观就不多说了。
执行sql如下: