一条慢SQL导致购物车服务无法使用的解决方案

概述

之前处理过一个购物车故障,觉得还挺经典的,在这里跟大家分享一下。这个故障直接导致前端添加购物车、获取用户购物车列表等操作都失败了。购物车是入口,一旦出现问题,影响极其严重。

临时处理

购物车服务所有接口,是有打印响应时间的,发现比平时慢了很多。由于情况已是十万火急了,我只能先重启购物车,缓冲一下,然后利用这段缓冲时间,赶紧定位问题。

问题定位

之前对购物车应用基于Spring Cloud微服务化了,已经稳定运行了几个月了,且当时上线前也经过压测,接口性能是没问题的。怎么突然之间就有问题了呢?根据以往的经验,大部分故障都是SQL语句引起的,因此首先导出数据库的所有慢SQL(腾讯云有导出慢SQL的工具)语句,发现大部分慢查询都是来自库存查询的SQL语句,有些甚至是10秒钟才执行完。

后来仔细一看,库存慢查询语句,要查询库存的商品比平时多很多。商品个数少的话,这条语句还是非常快的,一旦多了就开始慢了。

解决方案

由于库存计算体系的历史原因,这条SQL是很难优化的。情况又是十万火急的,大老板一直在问咋回事。因此临时改代码,将商品库存放到Redis缓存起来。购物车服务的话,是允许库存数据不实时的,因为后面的结算和支付会实时计算库存,库存不足的时候,会提示用户的。

注意:

  • 由于购物车是入口,流量很大,而从购物车到结算页再到支付,由于有一个操作步骤,因此结算页和支付页的流量是没有购物车那么大的;
  • 部分用户购物车上的商品数据是非常多的,但是未必都会买,用户也可以勾选要买的商品,然后下单;
  • 部分用户没有清理购物车失效商品的习惯,导致购物车上的商品非常多。

终极解决方案

将库存服务独立出去,将商品库存数据放置到缓存,并引入实时刷新缓存中库存数据的机制,让缓存中的数据尽量保证新鲜。这样的话,查询库存的时候,大部分都可以从缓存中获取,不会穿透到数据库上。

补充

我们对接口进行压测的时候,部分场景下,要考虑入参的个数,不能简单的用几个数据压测,觉得性能OK就不管了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • windows 环境下 MySQL 8.0.13 免安装版配置教程

    目录 下载压缩包 地址 https://dev.mysql.com/downloads/mysql/ 解压zip文件,创建 my.ini 文件 解压后目录: basedir=D:\mysql-8.0.13-winx64 数据目录: datadir=D:\mysql-8.0.13-winx64\data 创建 my.ini 文件,文件内容如下 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port=

  • mysql自增id超大问题的排查与解决

    引言 小A正在balabala写代码呢,DBA小B突然发来了一条消息,"快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入就会失败,balabala......" 我记得没有这么多,最多1k多万,count了下,果然是1100万.原来运维是通过auto_increment那个值看的,就是说,表中有大量的删除插入操作,但是我大部分情况都是更新的,怎么会这样? 下面话不多说了,来一起看看详细的介绍吧 问题排查 这张表

  • MySQL使用全库备份数据恢复单表数据的方法

    前言 备份数据库时,采用了全库备份,但是因为某些原因需要回滚一个表的数据到备份数据库上,如果回滚整个库就比较费时间,因为可能这个表只有几十M,但是其它表可能有十几上百G,这时候就需要将需要恢复的表提取出来了 我们在实际工作中都遇到过这种情况,一个MySQL实例中可能有多个database.而我们备份时,通常采用完全备份,将所有database都备份到一个文件中. 但是,偶尔会遇到只恢复一个database或者一个表的情况.怎么解决呢? 现在有备份库fdcsqlmysql-2018_11_30-0

  • MySQL查询中LIMIT的大offset导致性能低下浅析

    前言 我们大家都知道,mysql查询使用select命令,配合limit,offset参数可以读取指定范围的记录,但是offset过大影响查询性能的原因及优化方法 我们在业务系统中难免少不了分页的需求.想到分页的时候,大家肯定会想到使用SQL中的LIMIT来实现.但是,如果不正确的使用LIMIT会导致性能问题(SQL执行得很慢.有可能会拖垮服务器),也会被领导批的:所以,我们来看看如何正确地使用LIMIT. 下面话不多说了,来一起看看详细的介绍吧 LIMIT OFFSET, ROW_COUNT

  • MySQL用户账户管理和权限管理深入讲解

    前言 MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了. 下面话不多说了,来一起看看详细的介绍吧 mysql 的权限体系大致分为5个层级: 全局层级 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限. 数据库层级 数据库权限适用于一个给定数据库中的所有目标.这些权限存储

  • MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2.查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下: select count(username) as '重复次数',username from xi group

  • 如何批量测试Mybatis项目中的Sql是否正确详解

    去Oracle行动 最近公司要发展海外项目,所以要将现有的系统全部平移过去,另外数据库也要从原来的Oracle变为Mysql.公司的数据库交互层面使用的是Mybatis,而Oracle与Mysql也有一些语法上的不同.所以在项目中的Sql要改动,但是多个项目中涉及到的Sql非常多,如果仅凭人工一条一条辨别的话,工作量有点大.所以就萌发出了直接将数据源变为Mysql,利用反射批量执行Mapper中的方法,然后如果有参数的话,就设置为默认的初始值,然后记录下来成功的数据和失败的数据,这样就可以根据失

  • 详解易语言操作sql server实例

    最近看到很多初学者在问在易语言中如何操作SQL Server以外部数据库,也有人提出想要个全面的操作过程,为了让大家能够尽快上手,我给大家简单介绍一下操作SQL的过程,希望能起到抛砖引玉的作用. 由于我本身工作业比较忙,就以我目前做的一个软件的部份内容列给大家简单讲讲吧,高手就不要笑话了,只是针对初学者 第一步,首先需要建立一个数据库: 以建立一个员工表为例,各字段如下: 3 员工ID int 4 0 0 登陆帐号 nvarchar 30 1 0 密码 nvarchar 15 1 0 所属部门

  • 一条慢SQL导致购物车服务无法使用的解决方案

    概述 之前处理过一个购物车故障,觉得还挺经典的,在这里跟大家分享一下.这个故障直接导致前端添加购物车.获取用户购物车列表等操作都失败了.购物车是入口,一旦出现问题,影响极其严重. 临时处理 购物车服务所有接口,是有打印响应时间的,发现比平时慢了很多.由于情况已是十万火急了,我只能先重启购物车,缓冲一下,然后利用这段缓冲时间,赶紧定位问题. 问题定位 之前对购物车应用基于Spring Cloud微服务化了,已经稳定运行了几个月了,且当时上线前也经过压测,接口性能是没问题的.怎么突然之间就有问题了呢

  • 一条慢SQL语句引发的改造之路

    目录 前言 背景 分库分表 搜索引擎 OLAP(AnalyticDBMySQL) 双写 DTS 监听binlog 慢SQL 执行计划 实时同步延时 总结 前言 闲鱼服务端在做数据库查询时,对每一条SQL都需要仔细优化,尽可能使延时更低,带给用户更好的体验.但是在生产中偶尔会有一些情况怎么优化都无法满足业务场景.本文通过对一条慢SQL的真实改造,介绍解决复杂查询的一种思路,以及如何使得一条平均RT接近2s的SQL,最终耗时下降30倍. 背景 先来看一条SQL select id,userid,it

  • 浅谈java中异步多线程超时导致的服务异常

    在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调

  • 旧项目升级新版Unity2021导致Visual Studio无法使用的问题

    在项目开发过程中,不可避免的会升级开发工具.这次我在旧项目版本升级到新版Unity2021.2.x时,出现Visual Studio无法定位等问题.经过查阅资料将问题解决了,在这里为后来者提供一点帮助. Unity升级新版后,会出现的情况: 1.双击脚本会单独打开Visual Studio,类似下图 2.使用 Assets → Open C# Project,无法正常开启Visual Studio.可能直接打开项目目录 3.无法正常的生成解决方案,等等 4.新建工程可以正常使用 如有以上情况,可

  • SQL Server Agent 服务启动后又停止问题

    目录 Agent 服务启动后又停止 Agent服务无法启动如何破 问题现象 解决方法 Agent 服务启动后又停止 本地计算机上的SQL Server Agent 服务启动后又停止了,一些服务自动停止,如果它们没有什么可做的 例如“性能日志和警报“服务 1) 打开[SQL Server Configuration Manager] 2) 点开[SQL Server 2005网络配置] 3) 点选[SQLEXPRESS的协议] 4) 右点[TCP/IP] 5) 选择[属性] 6) 选择选项卡[IP

  • mysql一次将多条不同sql查询结果并封装到一个结果集的实现方法

    目录 前言 问题处理过程 1.使用union all进行并列查询 2.求和处理 总结 前言 最近遇到一个统计查询需求,要求一次性查询多个统计信息,其中两个查询信息不在一个表中,也没有业务关联,表中也没有做连接处理.不考虑产品设计是否合理,完全是实际需求如此,需要一次性查询出来返回给前端进行展示,对于这种“非常规”的统计查询平常肯定会遇见,感觉有点代表性,所以简单记录一下.希望对有相同需求的同学可以作为参考. 问题处理过程 简单交代一下业务场景,为方便理解,对业务需求做了简化处理. 现在有一个分销

  • ChatGPT用于OA聊天助手导致访问量服务宕机

    目录 闲谈 开搞 面临的问题 聊天UI 服务端接口 上线宕机 优化问题处理 流式传输 MD格式 看看效果 闲谈 最近,火到不行的明星团队产品 ChatGPT,热度一度非常高,付费用户都开始通过邀请制,专属登陆链接来限制流量了.开了Plus以后返回内容和速度真是10倍速啊~ 但对于小白或普通用户(也可能非技术行业的大佬),想要访问和体验还是挺麻烦的.除了准备梯子.接码.账号以外还可能遇到节点或网络,多次连接失败的问题. 所以,本着能折腾绝对不休息的原则,2天搞了一个聊天助手,凭借其语义的理解,关联

  • 磁盘写满导致MySQL复制失败的解决方案

    案例场景 今天在线上发现一个问题,由于监控没有覆盖到,某台机器的磁盘被写满了,导致线上MySQL主从复制出现问题.问题如下: localhost.(none)>show slave status\G *************************** 1. row ***************************                Slave_IO_State:                   Master_Host: 10.xx.xx.xx              

  • SQL Server数据库安装时常见问题解决方案集锦

    本文我们总结了几个在安装SQL Server数据库时常见问题的解决方案,供初学者学习参考,接下来让我们来一起看一下吧. 常见问题一: 安装Sql Server 2000时出现"以前进行的程序创建了挂起的文件操作,运行安装程序之前,必须重新启动计算机" ,重启后仍然无效. 解决方案: 1.不用退出Sql Server 2000安装程序,直接切换到桌面. 2.打开注册表编辑器(在"运行"中敲入"regedit"之后回车即可),定位到注册表的HKEY_

  • CentOS7 docker服务无法启动解决方案及实现步骤

    CentOS7  docker服务无法启动解决方案 检查步骤 启动docker服务: systemctl restart docker 这个时候会报错,请进行以下步骤: 1. 找到报错的类型,或者报错的说明. 2. 检查docker的配置文件 3. 检查磁盘空间 4. 检查端口占用情况 步骤详解 检查报错类型,查看日志: journalctl -xe 检查配置文件,不同操作系统位置基本相同: /etc/sysconfig/docker/ 或者直接找到docker运行程序,一般会有相关配置文件的默

随机推荐