前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文讲清,MySQL的执行计划

一文讲清,MySQL的执行计划

作者头像
用户1263954
发布2021-11-23 15:35:21
1.6K0
发布2021-11-23 15:35:21
举报
文章被收录于专栏:IT技术精选文摘IT技术精选文摘

查询语句的执行计划和SQL调优,是MySQL实践中对开发人员最为常见的一个技能了。

每次我们提交一个SQL查询语句给MySQL,他内核里的查询优化器,都会针对这个SQL语句的语义去生成一个执行计划,这个执行计划就代表了,他会怎么查各个表,用哪些索引,如何做排序和分组,看懂这个执行计划,你可能就会写出高性能的SQL语句了。

MySQL提供explain/desc命令输出执行计划,如explain select * from user;

一般,如果是一个简单的单表查询,可能执行计划就输出一条数据,如果你的SQL语句特别复杂,执行计划就会输出多条数据,因为一个复杂的SQL语句的执行会拆分为多个步骤,比如先访问表A,接着搞一个排序,然后来一个分组聚合,再访问表B,接着搞一个连接。

接下来,我们就先来研究一下这个执行计划里比较重要的字段都是什么意思。

(1)id

这个id呢,就是说每个SELECT都会对应一个id,其实说白了,就是一个复杂的SQL里可能会有很多个SELECT,也可能会包含多条执行计划,每一条执行计划都会有一个唯一的id,这个没啥好说的。

(2)select_type

select_type说的就是这一条执行计划对应的查询是个什么查询类型

(3)table

table就是表名,意思是要查询哪个表。

(4)type

type就比较重要了,提供了判断查询是否高效的重要依据依据,一般有这几种情况:

  • const

假如你写一个SQL语句select * from table where id=x或者select * from table where name=x,直接就可以通过聚簇索引或者二级索引+聚簇索引查询到你要的数据,这种根据索引直接可以快速查到数据的过程,称之为const类型,意思就是常量级的性能。

所以你以后在执行计划里看到const的时候,就知道他就是直接通过索引定位到数据,速度极快。

const类型要求你的二级索引必须是唯一索引,保证二级索引的每一个值都是唯一的才可以。

  • ref
  • range

range,顾名思义就是对一个范围查询时会走这种方式。

比如:selct * from table where age >=x and age <=x,假如age是一个普通索引,此时必然利用索引来进行范围查询,一旦利用索引做了范围查询,这种方式就是range。

  • index

第二个执行计划的select_type是SUBQUERY,就是子查询的意思,子查询针对的是t2这个表,当然子查询本身就是一个全表查询,但是对主查询而言,会使用x1 in 这个筛选条件,他这里type是index,说明使用了扫描index_x1这个x1字段的二级索引的方式,直接扫描x1字段的二级索引,来跟子查询的结果集做比对。

总结:

执行计划能为我们调优SQL提供很多信息,不同的SQL,不同的数据量,执行计划不一样,需要具体问题具体分析。

不过,我们调优SQL的本质是不变的,就是分析执行计划哪些地方出现了全表扫描,或者扫描的数据量太大,尽可能的通过合理优化索引保证执行计划每个步骤都可以基于索引执行,避免扫描过多的数据。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术精选文摘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档