MySQL之SQL分析三部曲实际案例(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 附上MySQL之SQL分析三部曲地址http://blog.itpub.net/29510932/viewspace-1709732/ --------------------------------------------------------------...
附上MySQL之SQL分析三部曲地址http://blog.itpub.net/29510932/viewspace-1709732/

-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------

由于是生产环境下进行的,截图和SQL都隐去了一些信息

背景:有用户在抱怨生产系统上,某一个Web的页面太慢,忍无可忍
问题分析过程:略
问题聚焦:最终确定是某一个SQL语句太慢,查询时间用了4s(慢查询日志给出的信息)
罪魁祸首的SQL语句:

点击(此处)折叠或打开

  1. select col1,col2......colN
  2. from tom
  3. inner join toa on tom.id = toa.id
  4. left join tov on tom.id = tov.id
  5. inner join toi on tom.id = toi.id
  6. left join fo on tom.stype = 2 and fo.id = tom.id
  7. WHERE ( tom.ostatus = 1 and tom.sid in ( 1 , 2 , 3) and tom.ptime >= '2333-01-01 09:41:58.056' and tom.ptime = '2333-02-01 09:41:58.056' and tom.otype != 2 and toi.iid = '233333333333333' and tom.stype in ( 1 , 2 ) ) order by tom.ptime desc limit 20,20
SQL分析三部曲之一:explain,结果如下图

可以很明显的看到主要问题出在tom表上,使用了索引还有这么高的rows,从常规考虑来说,这个SQL使用了错误的索引
那么查看一下这个表上的索引,发现tom表上是存在联合索引的,显然,手动指定索引就可以了。

以解决问题为目的,就到上面就可以了,不过为了弄清楚 优化器没有选择使用这个联合索引,反而用了效率更低的其他的索引的原因,还需要看具体的优化器判断过程

SQL分析三部曲之二:profile,拖慢SQL的主要问题在于扫描了不必要的数据,因此不必用profile来寻找时间消耗的主要目标

SQL分析三部曲之三:optimizer_trace,操作过程略,部分结果如图

从下图可以看到,在判断where条件时,优化器选择了这个联合索引,同时计算出了rows和cost


接着往下看优化器的逻辑,在最后,由于SQL语句中有limit m,n的存在,优化器重新计算了使用这个索引的cost


接下来就是喜闻乐见的索引更换


选择另外一个索引是因为primary key和ptime的索引能够组成二级索引,而且ptime也出现在了where的条件当中,所以最终的结果,就变成了最前面explain的extra里面出现的Using index condition

在实际的测试和验证过程中,删掉limit语句以后,优化器就能正确的选择最优的索引, 也证明了limit m,n这个语句是导致优化器做出了错误判断的罪魁祸首~

优化器计算的cost出现了问题?MySQL的优化器一直以来背了无数黑锅(口碑烂 ),不过真正导致优化器做出错误选择的家伙,一般是 表的统计信息不完整/不全面/不正确........

最后附上正确的执行计划截图

rows已经降到了11~

PS:Using index condition,
这是在在5.6之后新加入的特性,index condition pushdown,百度可以搜到很多介绍的文章,这里就略过了
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL技术之旅】(7)总结和盘点优化方案系列之常用SQL的优化
【MySQL技术之旅】(7)总结和盘点优化方案系列之常用SQL的优化
116 1
|
7月前
|
SQL 关系型数据库 MySQL
|
SQL 关系型数据库 MySQL
测一测自己的Sql能力之MYSQL的GROUPBY你弄懂了吗?
采用一个SQL语句,查询出: 每一位客户最后一次的下单时间、订单金额、商品名称;以及每一位客户的累计订单总笔数、最大订单金额
189 0
|
SQL 存储 数据挖掘
【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践
T-SQL 指的是 Transact-SQL,是一种针对 Microsoft SQL Server 数据库系统的 SQL 方言。T-SQL 扩展了标准 SQL 语言,提供了更多的功能和特性,包括事务处理、错误处理、游标处理、动态 SQL、存储过程、触发器、用户定义函数等等。
176 0
【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践
|
SQL 存储 缓存
高手都是如何做 Mysql 慢 SQL 优化
高手都是如何做 Mysql 慢 SQL 优化
371 0
高手都是如何做 Mysql 慢 SQL 优化
|
SQL 存储 缓存
图解MySQL系列(2)-SQL实战研究InnoDB架构设计
业务系统通过一个数据库连接发给MySQL,经过SQL接口、解析器、优化器、执行器,解析SQL语句,生成执行计划,接着由执行器负责执行该计划,调用InnoDB的接口去实际执行。
189 0
|
存储 SQL 关系型数据库
MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(2)
MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(2)
MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(2)
|
SQL 存储 关系型数据库
MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(1)
MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(1)
MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(1)
|
SQL Oracle 关系型数据库
软件测试mysql面试题:什么是SQL中的自动增量?
软件测试mysql面试题:什么是SQL中的自动增量?
105 0
|
SQL Oracle 关系型数据库
软件测试mysql面试题:如何定位重要的SQL?
软件测试mysql面试题:如何定位重要的SQL?
109 0