啰哩啰唆,只是自己mark下。看到的请绕道:)
相关的5个表:
1)订单表order 100W量 主键order_id
2)订单明细order_deatil(所购买的商品明细) 500W量 主键order_deatil_id 存订单表order_id
3)商品表goods
4)订单log记录order_detail_log表 每次对商品订单的操作都记录。3000W量 ,(没有在此表记录申请退款的时间)
字段:
order_id 订单id
order_deatil_id 订单明细id
status 状态 status为操作后的订单的状态
create_time 时间
opt 操作人
desstr 描述信息。
每个order_deatil_id作为记录单位
下单、支付成功 、申请退款等每个对订单明细的操作都记录 。
5)退款表order_refund (退款在单条的order_deatil上申请,不在order上申请) 10W
业务流程:
1.下单成order order_datail
order_detail_log做记录,动作为下单成功,状态为下单成功INIT
2.支付成功:
修改order order_datail状态为成功
order_detail_log做记录,动作为支付成功,状态为支付成功SUCCESS
3.用户申请退款(针对单条的order_datail申请,不是针对整个order)
修改order_datail 状态为退款审核中
order_detail_log做记录,动作为退款申请,状态为退款审核中
4.运营审核(针对单条的order_datail):
审核不通过 将order_datail修改为支付成功状态。
order_detail_log做记录,动作为退款拒绝,状态为退款拒绝
5。用户可继续申请第3 步骤。
这样order_detail_log每次都会记录用户申请退款的动作。
6.退款申请通过时,插入order_refund表
order_detail_log做记录,动作为退款通过,状态为退款成功
退款成功了就不能再次申请了~
需求:要查询申请退款时间在某个时间段内的订单明细数据,
需要用到order_datail order_detail_log 2个表
order_detail_log的status为退款审核中的order_datail_id
order_detail_log数据量3000W。增长很快。查询越来越慢。
解决方案:
1、在order_detail_log增加索引。status,会快很多。一段时间内,没问题,但是查询时间段大的时候可能会慢。
项目分成2次查询先查order_detail_log 符合时间的order_detail_id
再用sql: order_datail.order_datail_id in( '在order_detail_log中查出的order_detail_id集合') in当中条数多的时候会很慢。
前人开发时没敢直接把这2个表做join可能怕查死了。。。
2. 修改业务逻辑:
退款申请时直接插入order_refund表(退款审核中),不在审核通过时插入,
退款拒绝时将order_refund表状态改为退款拒绝
对可能驳回后,又申请的:order_refund表无数据,可申请,有数据状态为退款拒绝也可申请,再申请时将该条数据改为退款申请中,时间操作人等也修改。
这样查询申请退款时间 关联order_detail 和order_refund(状态不为驳回的)两个表。不再去超大的log表查询
3.在order_detail表加上申请退款时间的字段,加索引。
1.不用改现在的代码。可以运行一段没问题。
2.改动了现在的业务逻辑。代码改动稍微大一些
3.改动业务逻辑。表清晰了。不用关联别的表了。但是order_detail表已经有好多索引了。。(哪个项目这样的明细表不都得弄个 3 4个索引了~)
个人倾向:加完log的索引之后,按2修改。。