慢sql治理经典案例分享

简介:菜鸟供应链金融慢sql治理已经有一段时间,自己负责的应用持续很长时间没有慢sql告警,现阶段在推进组内其他成员治理应用慢sql。这里把治理过程中的一些实践拿出来分享下。

作者 | 如期
来源 | 阿里技术公众号

菜鸟供应链金融慢sql治理已经有一段时间,自己负责的应用持续很长时间没有慢sql告警,现阶段在推进组内其他成员治理应用慢sql。这里把治理过程中的一些实践拿出来分享下。

一 全表扫描

1 案例

SELECT count(*) AS tmp_count FROM ( 
SELECT * FROM `XXX_rules` WHERE 1 = 1 ORDER BY gmt_create DESC ) a

2 溯源

在分页查询治理的文章里已经介绍过我们系统旧的分页查询逻辑,上面的查询sql明显就是分页查询获取总记录数,通过XXX_rules表的分页查询接口溯源,找到发起调用的页面是我们小二后台的一个操作商家准入的页面,页面打开后直接调用分页查询接口,除了分页参数,不传入其他任何查询参数,导致扫描全表。

3 分析

灵魂拷问:为什么要扫描全表?全表数据展示到页面,花里胡哨的数据有用吗?

调研:和经常使用这个页面的运营聊后了解到,打开页面查询出的全表数据对运营是没有用的,他们根本不看这些数据。运营的操作习惯是拿到商家id,在页面查询框中输入商家id,查到商家数据后进行操作。

4 解决方案

由此优化方案就很明朗了:打开页面时不直接查询全量数据,等运营输入商家id后,将商家id作为参数进行查询。XXX_rules表中,商家id这一常用查询条件设置为索引,再结合分页查询优化,全表扫描慢sql得以解决。

优化后的小二后台页面如下:

打开页面时未查询任何数据,查询条件商家账户为必填项。

优化后的sql为:

SELECT count(*) AS tmp_count FROM ( SELECT * FROM `xxx_rules` WHERE 1 = 1 AND `rule_value` = '2928597xxx' ) a

执行EXPLAIN得到结果如下:

可以看到命中了索引,扫描行数为3,查询速度明显提高。

5 思考

扫描全表治理简单来说就是加入查询条件,命中索引,去除全表扫描查询,虽然有些粗暴,但并不是没有道理。实际业务场景中,很少有要扫描全表获取全部数据的情况,限制调用上游必须传入查询条件,且该查询条件能命中索引,能很大程度上避免慢sql。

另外,再引申下,XXX_rules初始的用意是准入表,记录金融货主维度的准入情况,最多也就几千条数据,但是很多同事将这张表理解为规则表,写入很多业务相关规则,导致这个表膨胀到一百多万条数据,表不clean了。这就涉及到数据表的设计使用,明确表的使用规范,不乱写入数据,能给后期维护带来很大的便利。

二 索引混乱

1 示例

2 分析

除了时间、操作人字段,XXX_rules表就rule_name、rule_value、status、product_code四个字段,表的索引对这四个字段做各种排列组合。存在如下问题:

1、rule_name离散度不高,放在索引首位不合适;

2、前三个索引重合度很高;

显然是对索引的命中规则不够了解。XXX_rules表很多业务有定时任务对其写入删除,索引多、混乱,对性能有很大的影响。

高性能的索引有哪些,再来回顾下:

1、独立的列:索引列不能是表达式的一部分;

2、选择区分度高的列作为索引;

3、选择合适的索引列顺序:将选择性高的索引列放在最前列;

4、覆盖索引:查询的列均在索引中,不需要回查聚簇索引;

5、使用索引扫描来做排序;

6、在遵守最左前缀的原则下,尽量扩展索引,而不是创建索引。

但凡记得第3和6规则,也不至于把索引建成这样。

3 治理

对索引进行整合如下:

系统中有很多任务拉取整个产品下的准入记录,然后进行处理,所以将区分度较高的product_code放在索引首位,然后添加rule_name、status字段到索引里,进一步过滤数据,减少扫描行数,避免慢sql。针对常用的rule_value查询条件,可以命中UK,因此不用单独建立索引。

三 非必要排序

1 问题描述

很多业务逻辑中,需要拉取满足某个条件的记录列表,查询的sql语句带有order by,记录比较多的情况,排序代价往往很大,但是查询出来的记录是否有序对业务逻辑没有影响,比如分页治理里讨论的count语句,只需要统计条数,order by对条数没有影响,再比如查出记录列表后,不依赖记录的顺序遍历列表处理数据,这时候order by多此一举。

2 解决方案

查询sql无limit语句,且业务处理逻辑不依赖于order by后列表记录的顺序,则去除查询sql中的order by语句。

四 粗粒度查询

1 问题描述

业务中有很多定时任务,扫描某个表中某个产品下所有数据,对数据进行处理,比如:

SELECT * FROM XXX_rulesWHERE rule_name = 'apf_distributors'AND status = '00'AND product_code = 'ADVANCE'

三个查询条件都是区分度不高的列,查出的数据有27W条,加索引意义也不大。

2 分析

实际业务量没那么大,顶多几千条数据,表里的数据是从上游同步过来的,最好的办法是让上游精简数据,但是由于业务太久远,找上游的人维护难度太大,因此只能想其他的办法。

这个定时任务目的是拉出XXX_rules表的某些产品下的数据,和另一张表数据对比,更新有差异的数据。每天凌晨处理,对时效性没有很高的要求,因此,能不能转移任务处理的地方,不在本应用机器上实时处理那么多条数据?

3 解决方案

数据是离线任务odps同步过来的,首先想到的就是dataWork数据处理平台。

建立数据对比任务,将定时任务做的数据对比逻辑放到dataWork上用sql实现,每天差异数据最多几百条,且结果集含有区分度很高的列,将差异数据写入odps表,再将数据回流到idb。

新建定时任务,通过回流回来的差异数据中区分度高的列作为查询条件查询XXX_rules,更新XXX_rules,解决了慢sql问题。

这个方法的前提是对数据实效性要求不高,且离线产出的结果集很小。

五 OR导致索引失效

1 案例

SELECT count(*)
FROM XXX_level_report
WHERE 1 = 1AND EXISTS (SELECT 1FROM XXX_white_list tWHERE (t.biz_id = customer_idOR customer_id LIKE CONCAT(t.biz_id, '@%'))AND t.status = 1AND (t.start_time <= CURRENT_TIMEOR t.start_time IS NULL)AND (t.end_time >= CURRENT_TIMEOR t.end_time IS NULL)AND t.biz_type = 'GOODS_CONTROL_BLACKLIST')

2 分析

explain上述查询语句,得到结果如下:

XXX_white_list表有将biz_id作为索引,这里查询XXX_white_list表有传入biz_id作为查询条件,为啥explain结果里type为ALL,即扫描全表?索引失效了?索引失效有哪些情况?

索引失效场景

1、OR查询左右有未命中索引的;

2、复合索引不满足最左匹配原则;

3、Like以%开头;

4、需要类型转换;

5、where中索引列有运算;

6、where中索引列使用了函数;

7、如果mysql觉得全表扫描更快时(数据少时)

上述查询语句第8行,customer_id为XXX_level_report表字段,未命中XXX_white_list表索引,导致索引失效。

3 解决方案

这个语句用condition、枚举、join花里胡哨的代码拼接起来的,改起来好麻烦,而且看起来“OR customer_id LIKE CONCAT(t.biz_id, '@%')”这句不能直接删掉。最后重构了该部分的查询语句,去除or查询,解决了慢sql。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022,你的团队距离持续部署还有多远?

简介&#xff1a;2022&#xff0c;你的团队距离持续部署还有多远&#xff1f;持续部署这个词我们经常听到&#xff0c;可是到底怎样才是做到了持续部署&#xff1f;如何才能做到持续部署&#xff1f;本文将为你逐层拆解持续部署的内涵和实施路径。 编者按&#xff1a;持续部署…

云原生时代,开发者应具备这5大能力

【CSDN 编者按】十年前&#xff0c;Netscape创始人、硅谷著名投资人马克安德森&#xff08;Marc Andreessen&#xff09;预言“软件正在吞噬世界”&#xff1b;数年后&#xff0c;软件里90%以上的代码都是开源代码&#xff0c;“开源正在吞噬软件”&#xff1b;如今&#xff0c…

庚顿数据:实时数据库赋能工业互联网

本期《看见新力量》采访了2021中国&#xff08;湘潭&#xff09;工业软件产业创新创业大赛全国总决赛季军——北京庚顿数据科技有限公司的总经理姚羽&#xff0c;一起来看看他们的实时数据库产品如何赋能工业互联网。 客户故事 自2007年8月成立以来&#xff0c;庚顿数据一直从事…

基因大数据:一面是科技,一面是责任

基因大数据&#xff0c;一面是科技&#xff0c;一面是责任。以基因科技为核心&#xff0c;为行业提供“存、传、算、用”全栈式解决方案&#xff0c;用数据智慧为精准医疗保驾护航。 客户故事 人和未来从创业初期到现在&#xff0c;阿里云一直伴随其成长&#xff0c;人和借助阿…

用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式

如何查询数据库服务器的时间格式 内容精选换一换CDM支持文件类数据到表的迁移&#xff0c;本章节以OBS-->MySQL为例&#xff0c;介绍如何通过CDM将文件类数据迁移到表中。流程如下&#xff1a;创建CDM集群并绑定EIP创建MySQL连接创建OBS连接创建迁移作业已获取OBS的访问域名…

一条 shell 命令的阻塞与唤醒

作者 | 闪客来源 | CSDN博客新建一个非常简单的 info.txt 文件。name:flash age:28 language:java在命令行输入一条十分简单的命令。[rootlinux0.11] cat info.txt | wc -l 3这条命令的意思是读取刚刚的 info.txt 文件&#xff0c;输出它的行数。我们之前分析了一下 shell 进程…

21克:仅需3天,我们就用Quick BI搭建起数据驾驶舱

简介&#xff1a;数智化并不仅仅是大型企业才需要去思考的课题&#xff0c;而是摆在所有企业面前的一个可选项。借助Quick BI搭建的数据分析体系&#xff0c;21克实现了销售、财务、供应链等多部门业务的数据化支撑&#xff0c;从一份份本地化的Excel文件&#xff0c;到清晰美观…

新监管形势下的数据流通合规技术解最新探究 (连载一)

简介&#xff1a;新监管形式下&#xff0c;数据的合规合理应用和数据安全是大家密切关注和探讨的话题点&#xff0c;而DataTrust隐私增强计算平台&#xff0c;能在保障数据隐私及安全前提下完成多方数据联合分析、联合训练、联合预测&#xff0c;实现数据价值流通&#xff0c;本…

查看系统是否安装了ftp服务器上,linux查看是否安装了ftp服务器上

linux查看是否安装了ftp服务器上 内容精选换一换安装Tomcat时启动失败。请按如下步骤查找原因并处理&#xff1a;对于已安装Tools的Linux弹性云服务器&#xff0c;升级内核前&#xff0c;需先卸载Tools&#xff0c;否则存在如下风险&#xff1a;升级内核后&#xff0c;Linux弹性…

掌握 Dowanward API 的妙用,轻松拿捏 kubernetes 环境变量

作者 | 江小南来源 | 江小南和他的小伙伴们引言前两天&#xff0c;公司有个新同事愁眉苦脸&#xff0c;看起来心事重重&#xff0c;我去问他怎么回事&#xff0c;原来是有个需求犯了难&#xff1a;一次部署起四个pod&#xff0c;每个pod名称还不一样&#xff0c;怎么判断是哪个…

一撕得:全员参与低代码开发,全面实现企业数字化管理

简介&#xff1a;借助钉钉宜搭&#xff0c;一撕得全面实现数字化管理&#xff0c;持续推动业务和企业进步。 北京一撕得物流技术有限公司 201-500人 / 互联网 / 中国-北京 / 数字化管理平台 “通过钉钉宜搭低代码技术&#xff0c;推进一撕得数字化转型。将日常办公及业务管理…

加码对象存储,XSKY星辰天合发布下一代对象存储XEOS V6

XSKY发布下一代对象存储XEOS V6&#xff0c;全新架构设计&#xff0c;具备“无限扩展”、“智能流动”、“多重保护”、“开放共赢”四大特性&#xff0c;进一步向主存储进军。 软件定义存储市场&#xff0c;即有传统存储大厂&#xff0c;也有更多优秀的国内存储厂商参与其中。…

引领新媒体时代的潮水方向—世相科技

漫步云端&#xff0c;世相科技正在引领新媒体时代的潮水方向。阿里云正在携手越来越多的新媒体客户&#xff0c;一道致力于简化基础设施与架构&#xff0c;提升更优的行业竞争力。 客户故事 新媒体的飞速发展&#xff0c;为各种创意传播带来了崭新机遇。世相科技子公司研发的中…

推文科技:AI解决方案助力内容出海

2017年&#xff0c;推文科技成立&#xff0c;推出业内针对网络文学的AI系统&#xff0c;助推网文批量出海。2018年&#xff0c;阿里云上线海外可用区&#xff0c;推文科技开始与阿里云合作。 创业宣言 创业是一件用行动去实践相信的事情&#xff0c;也许有一天&#xff0c;我…

多线程一定能优化程序性能吗?

作者 | 陆小风来源 | 码农的荒岛求生问&#xff1a;如果一个和尚挑水喝&#xff0c;两个和尚抬水喝&#xff0c;三个和尚没水喝&#xff0c;那么众人拾柴一定火焰高吗&#xff1f;多线程一定能提高程序性能吗&#xff1f;在计算机科学中&#xff0c;这个问题的标准答案是“it d…

4种常见分支模式解析及优劣对比

简介&#xff1a;团队研发的本质并不是团队规模越大&#xff0c;研发的效率就越高。我们以为团队规模越大&#xff0c;研发效率就会越高&#xff0c;可以做越多的东西&#xff0c;但是我们发现团队规模大到一定程度&#xff0c;整个研发效率是会下降的&#xff0c;甚至降得非常…

重构知识的供给模式 ——《数据平台》从思考到落地

简介&#xff1a;如何去建立一套 “高度自动化&体系化的知识管理系统&#xff0c;重构知识的供给模式”。是不是看不懂&#xff1f;而且有点冲&#xff1f;是不是谜语人附体&#xff1f;别急&#xff0c;本文作者将会做详细的说明。 作者 | 七惜 来源 | 阿里技术公众号 一…

PolarDB for PostgreSQL 内核解读 :HTAP架构介绍

简介&#xff1a;在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力&#xff0c;对一套 TP的数据支持两套执行引擎&#xff1a;单机执行引擎用于处理高并发的 OLTP&#xff1b;MPP跨机分布式执行引擎用于复杂的 OLAP 查询&#xff0c;发…

kubernetes 的这几种存储卷,别再傻傻分不清了

作者 | 江小南来源 | 江小南和他的小伙伴们存储卷类型Kubernetes提供的存储卷&#xff08;volume&#xff09;属于Pod资源&#xff0c;共享于Pod内的所有容器&#xff0c;存储卷可在容器的文件系统之外存储相关的数据&#xff0c;也可以独立于Pod的生命周期实现数据持久化存储。…

这群人,用8年讲述体育能有多迷人

望尘科技&#xff1a;专注体育娱乐在线体验的自主研发&#xff0c;致力于让体育迷获得高品质的沉浸式体验。用科技致敬体育&#xff0c;是他们坚持的信仰。 客户故事 望尘科技一心专注深耕体育游戏。他们把自己的计算中心搬到了云上&#xff0c;借助阿里云数字基础设施为程序…