当前位置: 首页 > 后端技术 > Java

学会使用MySQL的Explain执行计划,SQL性能调优不再难

时间:2023-04-01 14:55:38 Java

上一篇讲了MySQL架构体系,了解到MySQLServer端的优化器可以生成Explain执行计划,执行计划可以帮助我们分析SQL语句性能瓶颈,优化SQL查询逻辑,今天一起学习Explain执行计划的具体用法。1.explain的使用使用EXPLAIN关键字来模拟优化器执行SQL语句,分析你的查询语句或结构的性能瓶颈。在select语句前加上explain关键字,MySQL会在查询上设置一个flag,执行查询会返回执行计划信息,不会执行这条SQL。例如,以下内容:为什么输出了这么多列?其实大部分都是SQL语句的性能统计指标。首先简单总结一下各栏目的大致功能,下面再进行详细说明:2.explain字段详解下面是对各栏目具体功能的详细说明。1、id列id表示查询语句的序号,自动分配,按顺序递增。值越大,执行优先级越高。ID相同时,优先级从上到下。2、select_type列select_type表示查询类型,常见的有SIMPLE简单查询、PRIMARY主查询、SUBQUERY子查询、UNION联合查询、UNIONRESULT联合临时表结果等。3、表列表表示表名、表别名,SQL语句查询到的临时表名。4、partitions列partitions表示SQL查询匹配到的分区。如果没有分区,则显示NULL。5、type列type表示表连接类型或数据访问类型,即表与表之间如何建立连接,或如何访问数据。具体有以下几个值,性能从好到坏的顺序是:system>const>eq_ref>ref>ref_or_null>index_merge>range>index>ALLsystem当表中只有一行时,即系统表,是const类型的特殊列。const表示使用主键或唯一索引进行等价查询,最多返回一条记录。性能不错,推荐使用。eq_ref表示表连接使用主键或唯一索引,下面的SQL使用用户表的主键id。ref表示使用非唯一索引进行等价查询。ref_or_null表示非唯一索引用于等效查询并且包含具有空值的行。index_merge表示用于索引合并的优化逻辑,即使用多个索引。range表示使用索引范围查询。index表示使用索引进行全表扫描。ALL表示全表扫描,性能最差。6.possible_keys列表示可能使用的索引列,在实际查询中不一定会用到。7.keycolumn表示实际查询中使用的索引列。8.key_len列表示索引占用的字节数。每种类型占用的字节数如下:类型占用空间char(n)n字节varchar(n)2字节存储变长字符串,如果是utf-8,长度为3n+2tinyint1字节smallint2bytesint4bytesbigint8bytesdate3bytestimestamp4bytesdatetime8bytes该字段允许额外1byte为NULL9.ref列表示与where语句或表连接中的索引比较的参数,常见的是const(常量),func(函数),字段名。如果没有使用索引则显示NULL。10.rows列表示执行SQL语句扫描的行数。11.filteredcolumn表示被条件过滤的表行的百分比。用于估计与其他表连接时扫描的行数,rowxfiltered=252004x10%=250,000rows12.Extra列表示一些额外的扩展信息,不适合显示在其他列中,但是很重要。使用where表示使用where条件查找,但不使用索引。使用索引就是使用覆盖索引,即可以在索引上找到需要的数据,不需要二次查询表,性能更好。Usingfilesort表示使用外部排序,即排序字段不使用索引。使用临时表意味着使用临时表。在下面的示例中,临时表用于存储查询结果。使用joinbuffer表示在进行表关联时,不使用索引,connectionbuffer用于存储临时结果。在以下示例中,user_id未在两个表中建立索引。Usingindexcondition表示使用了索引下推的优化特性。知识点总结:本文详细介绍了Explain的使用方法以及各个参数的含义。无论是工作还是面试,使用Explain优化SQL查询都是必备技能,必须牢记。下篇我们将一起学习SQL查询的其他优化方法,敬请期待。文章持续更新中,大家可以在微信搜索“一光架构”第一时间阅读更多技术干货。