一、sql优化:
优化原则参考下面几点:
1.能过滤掉多数数据的条件放在最后,例如查询债权,从左到右的顺序为表关联、债权状态、投资人ID,项目ID,债权ID
2.能不用left/right join的尽量不用
3.多表关联将数据少的表放在右边,比如项目表和债权表关联将项目表放右边
4.数据类型精确匹配,查询条件的数据类型要和数据库类型一致,减少类型转换的消耗;比如字符类型用xxx='yy',数字类型用xxx=n;
5.能用union或between 不用 or 和 in
6.能用union all(不去重)避免用union(去重);
二、更新、删除加乐观锁,并获取更新条数:
更新数据不要更新整个表字段,只更新需要更新的字段,新开发的功能要求删除、更新要有乐观锁(可以是时间戳字段或被更新字段更新前的值),防止数据已被更新,
并且获取更新受影响的行数判断是否更新成功,如果更新不成功根据具体业务需要做相应处理
比如:
资金余额更新,where 条件可以加上 余额=原来的余额,modifytime=更新前的时间戳,
债权状态更新,where 条件可以加上 状态=原来的状态,modifytime=更新前的时间戳;
注意:现有的更新语句没有判断字段是否有值就直接更新了,未被赋值的字段会被覆盖成空值,原来的更新语句是需要改造的,不能直接使用
三、获取当前时间:
mgr层统一用getCurrentDbTime()获取当前时间(已改造,更新/seaway-p2p-biz-mgr/src/main/java/com/seaway/p2p/biz/mgr/base/BaseMgrImpl.java),不用查询数据库,但要注意这里是因为我们有时间服务器保证数据库时间一致,如果没有这个机制不能这样写;
public Date getCurrentDbTime() {
return new Date();
}
四、事务(多表操作,且表之间数据要求强一致性):
涉及事务的操作不能直接把更新操作写在ctr层(ctr层没有事务管理),统一写在mgr(分库后的代码结构略有不同,到时候会给大家培训),不需要事务的操作不要加事务
其他优化事项我们逐步完善,规范,也欢迎大家主动提出优化建议;
优化原则参考下面几点:
1.能过滤掉多数数据的条件放在最后,例如查询债权,从左到右的顺序为表关联、债权状态、投资人ID,项目ID,债权ID
2.能不用left/right join的尽量不用
3.多表关联将数据少的表放在右边,比如项目表和债权表关联将项目表放右边
4.数据类型精确匹配,查询条件的数据类型要和数据库类型一致,减少类型转换的消耗;比如字符类型用xxx='yy',数字类型用xxx=n;
5.能用union或between 不用 or 和 in
6.能用union all(不去重)避免用union(去重);
二、更新、删除加乐观锁,并获取更新条数:
更新数据不要更新整个表字段,只更新需要更新的字段,新开发的功能要求删除、更新要有乐观锁(可以是时间戳字段或被更新字段更新前的值),防止数据已被更新,
并且获取更新受影响的行数判断是否更新成功,如果更新不成功根据具体业务需要做相应处理
比如:
资金余额更新,where 条件可以加上 余额=原来的余额,modifytime=更新前的时间戳,
债权状态更新,where 条件可以加上 状态=原来的状态,modifytime=更新前的时间戳;
注意:现有的更新语句没有判断字段是否有值就直接更新了,未被赋值的字段会被覆盖成空值,原来的更新语句是需要改造的,不能直接使用
三、获取当前时间:
mgr层统一用getCurrentDbTime()获取当前时间(已改造,更新/seaway-p2p-biz-mgr/src/main/java/com/seaway/p2p/biz/mgr/base/BaseMgrImpl.java),不用查询数据库,但要注意这里是因为我们有时间服务器保证数据库时间一致,如果没有这个机制不能这样写;
public Date getCurrentDbTime() {
return new Date();
}
四、事务(多表操作,且表之间数据要求强一致性):
涉及事务的操作不能直接把更新操作写在ctr层(ctr层没有事务管理),统一写在mgr(分库后的代码结构略有不同,到时候会给大家培训),不需要事务的操作不要加事务
其他优化事项我们逐步完善,规范,也欢迎大家主动提出优化建议;