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放到数据库过滤一把,存在的就批量更新,不存在的,就批量插入,这种方式,性能更好。
今天想到的就这些,先写这么多。