资金项目性能优化

1、项目背景sql

    该项目是一个对资金还、回款改造的项目。之前的作法是,在签约或者发生标转让的时候生成回款信息,直接插入回款表,下次回款时从回款表里面查找。如今这张表有2亿+条数据,100G的数据量,而且还在快速增加,随时都有可能爆发出问题。改造的逻辑是,按照投资人投资的金额占比来实时计算回款。数据库

 

2、性能优化缓存

       一、缓存优化性能优化

        针对咱们这种应用场景,大部分状况是投资人查看本身投了某一个标的回款状况。这里,能够根据标和投资人作一个回款记录的缓存,在service层就能够把用户请求给作掉。为了保证数据一致性,在实际发生回款的时候,刷新这条缓存数据。服务器

 

      二、多线程优化多线程

       线上的服务器通常都多核的,彻底能够开多个线程同事跑,充分利用计算资源。在这个项目中,对历史数据作订正的时候,同时开了20个线程并发修复历史数据。这里要注意一点,涉及到资金的数据一致性要求很高,通常会用到事务,这里多线程要防止发生死锁。并发

 

     三、对经常使用的字段建索引性能

      本次项目中涉及到几个表关联查询,几张表有1000w-2000w条数据,对关联的字段创建索引以后,单次查询时间由原来的1.5s降到了200ms左右。查询效率提升了好几倍。测试

 

    四、Ibatis表达式优化优化

       单个查询中,一个SQL上千个字符,若是直接把sql裸露在<select> </select>关键词中间,其实ibatis要作不少检查的工做,若是这些sql是纯查询语句,不涉及到ibatis关键字,能够用这个<![CDATA[       ]]> 括起来,性能能够提升不少。个人一个测试用例中,由原来的700ms压缩到200ms。

 

    五、SQL结构优化

      简单的SQL结构优化空间可能不大,复杂的SQL尤为是涉及关联查询或嵌套查询的,若是单表数据量比较大,结构优化空间就很大了。每一次关联就是笛卡尔乘积,若是两张表都有必定的数据量,则乘积的数据量就很大了。这里,咱们能够遵照几条原则:

      5.1  条件尽可能用到尽量多下降笛卡尔积的子查询中,使得总得笛卡尔积最小化。好比说:A表中有20条数据;B标中有10条数据。若是过滤条件放在A中查询能过滤15条数据,一样的过滤条件放在B中查询能过滤7条数据,则把过滤条件放在A中过滤,由于放在A中整体笛卡尔积只有有50,而放在B中笛卡尔积则有60条数据。

     5.2 查询条件尽量的走索引。好比一样的查询条件,能够拆分开,使得其中部分查询能够走某一张表的索引,则拆开查询。

    5.3 能不要加括号的则不要加括号。增长了括号会限定执行的顺序。其实数据库自身会根据查询条件优化查询的。若是增长没必要要的括号,会限定查询的顺序,使得数据库没法优化查询。

   5.4 构建组合索引,索引字段顺序问题。构建组合索引,经常使用来查询的字段放在前面,部分查询字段顺序保持跟索引字段顺序一致。

  5.5 刷选最多的条件优先执行。把刷选数据最多的条件放在最早执行的位置。

  5.6 慎用merge into语句。批量执行merge into时,当符合条件就更新,不符合条件就插入。这种状况性能不好。能够把整个list放到数据库过滤一把,存在的就批量更新,不存在的,就批量插入,这种方式,性能更好。

 

   今天想到的就这些,先写这么多。

相关文章
相关标签/搜索