当前位置: 首页 > 知识库问答 >
问题:

后端 - 怎么优化退差价时需要执行大量 SQL 的情况?

呼延永新
2023-11-07

假设有以下情况,有一个虚拟商品A,订阅价格 100 元/月,

按照规则,如果商品降价,则系统需要自动退还本月差价,

退差价的逻辑是,将本月的付款退款,然后重新按新的价格扣款,

那么,假设此时有 100 个用户订阅了此商品,商品降价一次,则需要分别执行退款和重新扣除的sql,大约 300 条sql来处理订阅者的退款数据,执行 300 条 SQL 需要耗费大量时间

有没有办法优化这种情况?

共有3个答案

索瀚海
2023-11-07

我觉得执行300条sql来重新以用户为单位处理的计费信息,挺合理的,如果你在一个语句里处理所有用户退款,我觉得这风险还是挺高的。
如果担心时间问题,我认为可以写到队列然后异步多线程执行。但是每个用户的退扣款都应该是事务的。

宋正真
2023-11-07

这个理论对数据库压力不会特别大,如果真的特别大,你可以选择弄个定时任务,每天晚上业务低峰执行,并且批量操作,这样可以减少数据库与服务器的压力

曾嘉荣
2023-11-07

对于这种情况,你可以考虑以下几种方式来优化:

  1. 批量处理:如果可能的话,将多个用户在一次操作中处理完毕,而不是逐个用户进行操作。你可以使用批处理语句或者存储过程来实现。
  2. 事务:将退款和重新扣款的操作放在一个事务中执行,以确保操作的原子性。这样,即使有部分用户操作失败,也不会影响到其他用户的操作。
  3. 并发处理:如果数据库支持并发处理的话,你可以使用并发的方式来同时处理多个用户的操作。这种方式需要仔细考虑并发控制和数据一致性的问题。
  4. 优化SQL语句:对于大量的SQL语句,可能需要优化SQL语句本身,以提高执行效率。例如,使用索引、减少全表扫描等。
  5. 异步处理:将退款和重新扣款的操作放在后台异步执行,这样不会影响用户正常的使用体验。但是需要注意,这种方式需要处理好异步状态的通知和异常处理的问题。
  6. 数据库优化:根据具体的数据库类型和配置,可能需要优化数据库的参数或者调整数据库的结构来提高处理效率。
  7. 使用专门的工具或者服务:有些数据库厂商或者第三方服务商可能会提供专门的工具或者服务来处理大规模的数据操作。你可以考虑使用这些工具或者服务来提高效率。

以上只是一些常见的优化思路,具体的优化方案需要根据你具体的业务场景和数据库环境来确定。

 类似资料:
  • 问题内容: 我正在尝试做一个欧拉计画问题,但它涉及到添加一个非常大的数字。(100!) 使用Java int和long太小。 谢谢你的建议 问题答案: BigInteger类 看起来可能是您想要的。

  • 我正在努力改进我写的一个数据传输程序。我在寻找如何让它更快的建议。我的程序通过填充ResultSet并将结果写入文件来从数据库(通常是Oracle11g)中提取数据。该程序定期查看表,并查询某个特殊列是否发生了更改。例如,这可能是这样一个查询:

  • 我知道在一堂课上 我可以在初始值设定项列表中初始化,如下所示: 但是,如果计算所需的数据来自字符串并且可能涉及计算,那么从第二个构造函数初始化的正确方法是什么?

  • 本文向大家介绍SQL命令优化需要记住的9点事项,包括了SQL命令优化需要记住的9点事项的使用技巧和注意事项,需要的朋友参考一下 与数据库交互的基本语言是sql,数据库每次解析和执行sql语句多需要执行很多步骤。以sql server为例,当数据库收到一条查询语句时,语法分析器会扫描sql语句并将其分成逻辑单元(如关键词、表达式、运算符和标识符)并生成查询树,最后查询优化器将分析所有可以访问数据库的

  • 问题内容: 我当前的查询如下所示: 语义: 有两个输入值: 第4行:点数组 第12行:双精度数字: 第一段(第1-6行): 从点数组创建表以用于… 第二段(第8-14行): 对于表中的每个点:从表中获取一个随机(!)点,其距离< 将那些元组保存在表中 第三段(第16-19行): 对于表中的每个值:获取所有值并… 如果值不是唯一的:则选择一个随机值 输出:,,,(从输入值) 表格示例: 结果示例: