![]() |
1
3
ajreal的解决方案存在一个疏忽——它没有为不同的成员id重置balance变量。这个版本修复了这个问题。 这个有效(我测试过):
|
![]() |
2
2
你真的不想用这种方式实现它。 你不知道当你需要推迟交易日期的时候,你会发现自己会受到伤害。1M的记录没有那么多,所以索引应该是足够的… |
![]() |
3
0
简单的
|
![]() |
4
0
这是对形势的分析 首先,我使用小python脚本创建了100万条记录
然后创建表事务
(我从中减去了期末余额,那是一个毫无意义的非规范化) 然后用
但是,我的第一个问题是建立糟糕的性能,下面的查询在0.10秒内运行,没有添加任何索引
然后我尝试加入成员表,我从现有的事务数据创建,但是查询
运行0.17秒 所以,我无法复制这个问题。因此,我建议将上述查询作为解决方案,或者请求更多信息来尝试复制问题。 |
![]() |
5
0
为什么不从存储过程创建物化视图?它将分离数据和计算值之间的逻辑。它还将提供尽可能快的查询。 |
![]() |
6
0
解决方案需要一个程序-我将通过存储过程显示它。 SQL在查询时尤其不擅长依赖于基于列的表中行的顺序,这些列的值是未知的,比如您的id列。处理这种情况的唯一方法是使用某种扫描数据的可执行代码。 虽然你还没说,但我假设逻辑是:
注意,这里有一个明显的问题:如果状态发生变化(从2到1或从1到2),会发生什么?从那时起,它将需要重新计算该成员的交易 下面是执行此操作的存储过程:
注意,状态的处理是在查询中处理的。 下面是要测试的代码:
执行这些命令将显示存储过程产生正确的结果。 |
![]() |
7
0
当状态从2变为1时,您不会说明会发生什么,是否所有跟随它的数据都需要相应地更新打开和关闭值?如果不是,那么你的系统有严重的问题。如果是这样的话,你将需要重新计算所有这些数据很多次,这就是为什么你要问这个问题的原因吗? 首先,没有理由同时存储所有记录的开始值和结束值, 关闭=打开+(如果状态为1,则金额为0结束),这将是所需计算的一半。 接下来,也许您最好只存储10、20、50或100+条记录作为关键点。因此,您只对100个ID值的括号进行了总结,总共有73020个ID值。如果您真的希望这样做,可以将其更改为还包括汇总级别上所有以前值的总运行总数。 通常,金融系统只会逐月存储期初值和期末值,并在该月内重新计算这些值。想想你的用户实际上需要这个数据,相比于当状态“2”变成状态“1”时必须不断更新它时的过度复杂性。 我建议您存储周期值,而不是:
等等,这是一个更好的数据模式,而且维护起来要容易得多。 要更新这些值,只需确定需要更新的期间,然后重新计算该期间的总计,然后只需更新所有后续期初值。即使有30000个不同的会员,你也需要4年的时间才能达到100万记录(如果你使用每月的周期),在这段时间里,我预计你的交易量将远远超过(10-50倍的数量),因此,这样做的结果是工作量减少了10-50倍,对最终用户性能的影响非常小。 |
![]() |
hello_programmers · Mysql从其他表输出一列 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |
![]() |
Popo · Sql查询:返回数据库中不可用的where条件 1 年前 |
|
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 1 年前 |
|
Kugelfisch · 用php为数据库加密数据 1 年前 |