28个案例问题分析---02---sql优化--mysql执行顺序、explain关键字解析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 28个案例问题分析---02---sql优化--mysql执行顺序、explain关键字解析

mysql执行顺序,explain关键字

总结提升

背景

由于查询SQL时间过长,导致接口请求超时,我们对执行的sql进行了对应的sql优化。这里总结复盘一下sql优化的过程以及对应的结果。


前置知识

这里前置知识主要分为两个部分,分别是: mysql的执行顺序和explain关键字解析。


1.mysql的执行顺序

2.mysql的执行顺序如下

3.from

4.on

5.join

6.where

7.group by

8.having + 聚合函数

9.select

10.distinct

11.order by

12.limit

基本数据:

Mysql的执行顺序是先去执行 from 然后根据 on关键字去筛选目标表,筛选出的结果在进行join 或者using,这样形成一个临时表。然后去使用 where 条件去筛选这个临时表。然后对这个临时表进行 group by 进行分组(如果有having 就去筛选)。执行到这里,所需要的数据基本就有了。


目标数据:

select来筛选我们需要的目标列,筛选完成之后,使用 distinct ,order by ,limit ,进行数据的筛选,我们所需要的数据即搞出来了。


分析代码

上面的查询一共分成了6个代码块。基本囊括了上文所说的执行顺序。在这个实例里,sql语句执行的顺序应该是

2–>3–>4–>1–>5–>6


清楚了执行顺序的作用

我们清楚了mysql的执行顺序由什么作用呢?对我们对mysql的使用有什么帮助呢?


筛选数据

能写到on里的条件不写到 where里,能写到where里的不写到having里。

where条件里,将排除信息多的条件写到前面


提升认识

利于我们理解sql语句,并对sql语句进行优化,提高我们对数据库的理解。利于以后编写复杂的sql语句。


explain关键字解析

概念

explain 英文含义是解释、说明的意思。在mysql里,一条查询语句需要经过MySql查询优化器的各种成本和规则,生成一个执行计划。而explain关键字就是来查询这个计划的。通过explain关键字,可以分析我们的查询语句的效率。

语法: explain select * from table

基本构成

列名 用途 构成
id SELECT查询语句都对应一个唯一id id越大,越优先执行。相同由上向下执行。NULL最后执行
select_type SELECT对应的查询类型 (SIMPLE:简单查询不包含子查询和UNION查询)、 (PRIMARY:复杂查询中最外层SELECT) 、(DERIVED:包含对于派生表的查询)、(UNION: 在 UNION 查询语句中的第二个和紧随其后的 SELECT)。
table 表名 值可能是表名、表的别名或者一个未查询产生临时表的标识符。table 列是 格式时,标识此查询依赖于 id = N的查询。先执行id = N的查询
partitions 匹配的分区信息
type 单表的访问方法 从优到差 system > const > eq_ref > range > index > all
possible_keys 可能用到的索引 与具体建立的索引有关
key 实际使用到的索引 与具体建立的索引有关,未使用的话是null
key_len 实际使用到的索引长度
ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows 预估需要读取的记录条数
filtered 某个表经过条件过滤后剩余的记录条数百分比 对于单表来说意义不大,主要用于连接查询中。
Extra 额外的一些信息 有几十个,根据信息进行查询

重点

看到上面这么多的构成,信息,头都大了。我们还是列一下需要重点进行关注的信息


id

id越大,优先级越高,Id相等,从上往下顺序执行。

select_type

SIMPLE简单查询,PRIMARY复杂查询,DERIVED衍生查询(from子查询的临时表),派生表。

type

system > const > eq_ref > range > index > all 阿里巴巴规约要求最差也要是range级别。

distinct和group by效率对比

结论:


有索引的情况下,group by和distinct 都能用索引,效率相同

无索引的时候,distinct 效率高于 group by,distinct 是根据信息不同进行直接进行去重,group by 的原理是对结果先进行 分组排序 ,然后返回每组中的第一条数据。

用法

distinct 的用法 select distinct 列1 , 列2 from table

group by 的用法 select 列1,列2 from table group by 列1 ,列2

优点,缺点


1.如果是单纯的去重操作的话,无论是否有索引,distinct 的效率都更加高,但是如果 查询的列和去重的列不对应的话,distinct就无法使用了。相较于group by 不够灵活。

2.group by 的语义更加的明确,并且group by 可以根据分组的情况加上聚合函数,做一些其他的处理,功能更加丰富。但是有时候效率将低于distinct。、

优化案例

原sql语句

SELECT
  aui.ding_phone,
  aui.ding_name,
  aui.chaoxing_name,
  aui.chaoxing_phone 
FROM
  ( SELECT info_id FROM arpro_user_course_info WHERE course_id = 223667994 AND class_id = 55801765 AND is_delete = 0 GROUP BY info_id ) auci
  LEFT JOIN arpro_user_info aui ON auci.info_id = aui.id

优化

1.arpro_user_course_info 表添加索引。


分析结果 对 arpro_user_course_info 的查询已经走了我们建立的索引了

2.group by 改为 distinct。

3.解决数据类型不一致导致主键索引失效问题


查看我们优化过后的sql不难发现,我们的 aui也就是 user_info 表 走的还是全表检索。但是实际上我们的sql语句中只用到了 user_info 表的 主键id字段,按道理将,这个查询应该走 一级索引 也就是主键索引。让我们来排查一下数据类型这里我们看到 user_info 表的主键为 varChar类型,而user_course_info 表的外键为 bigint类型,由于联查的时候,主外建不一致,导致的索引失效,从而导致索引失效,sql变慢。

阿里规约规定:让我们将 user_info 表的字段修改为bigint,查看一下语句分析结果这时我们可以看到,两个表的查询均走了对应的索引。对应的sql语句就优化好了。

总结提升

本次主要讲解了,如何着手去分析sql语句,从哪些方面做sql优化。对以上知识清晰,才能写出高性能的sql语句

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
10天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
44 3
|
10天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
62 6
|
10天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
57 1
|
1月前
|
存储 关系型数据库 MySQL
深入理解MySQL索引类型及其应用场景分析。
通过以上介绍可以看出各类MySQL指标各自拥有明显利弊与最佳实践情墁,在实际业务处理过程中选择正确型号极其重要以确保系统运作流畅而稳健。
110 12
|
1月前
|
存储 SQL 关系型数据库
MySQL中binlog、redolog与undolog的不同之处解析
每个都扮演回答回溯与错误修正机构角色: BinLog像历史记载员详细记载每件大大小小事件; RedoLog则像紧急救援队伍遇见突發情況追踪最后活动轨迹尽力补救; UndoLog就类似时间机器可倒带历史让一切归位原始样貌同时兼具平行宇宙观察能让多人同时看见各自期望看见历程而互不干扰.
144 9
|
2月前
|
存储 SQL 关系型数据库
MySQL的Redo Log与Binlog机制对照分析
通过合理的配置和细致的管理,这两种日志机制相互配合,能够有效地提升MySQL数据库的可靠性和稳定性。
114 10
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
2月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与性能优化全解析
我整理的这份内容涵盖了 MySQL 诸多核心知识。包括查询语句的书写与执行顺序,多表查询的连接方式及内、外连接的区别。还讲了 CHAR 和 VARCHAR 的差异,索引的类型、底层结构、聚簇与非聚簇之分,以及回表查询、覆盖索引、左前缀原则和索引失效情形,还有建索引的取舍。对比了 MyISAM 和 InnoDB 存储引擎的不同,提及性能优化的多方面方法,以及超大分页处理、慢查询定位与分析等,最后提到了锁和分库分表可参考相关资料。
|
3月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。

推荐镜像

更多