思路一转,春暖花开!动动手指,这段程序性能又双叒叕提升2s~15s()

  本篇文章为你整理了思路一转,春暖花开!动动手指,这段程序性能又双叒叕提升2s~15s()的详细内容,包含有 思路一转,春暖花开!动动手指,这段程序性能又双叒叕提升2s~15s,希望能帮助你了解 思路一转,春暖花开!动动手指,这段程序性能又双叒叕提升2s~15s。

  性能优化说明:判断数据表里是否有数据,用limit 1/top 1取代求count,这一点对于大表来说相当明显。思路一转,春暖花开!

  近期,数据中心系统负荷大,mysql服务器的CPU动辄高达90%以上。代码和数据表存在很大优化空间。

  这里分享一个定时同步数据的Job任务的优化过程。

  

  先上代码

  

public void executeJob(String jobParameter) {

 

   //获取风控个体工商业者信息表数据总计,如果没有任何数据,则需要初始化

   int sohoCount = sbhSohoManager.count();

   if (sohoCount == 0) {

   // 首次同步数据

   } else {

   // 非首次,增量同步数据

  }

 

  

  从这段代码不难看出来,根据表的数据量来走不同的分支处理逻辑。

  其中,sbhSohoManager#count是mybatisplus原生的count方法。对应SQL是:SELECT COUNT(1) FROM sbh_soho
查log,发现这么一个count,耗时竟然2s~15s。

  从数据库知识看解释,也不难理解,因为这个宽表的数据量已经快上千万条记录了(24个字段,9,059,527条记录),求count自然就会慢下来。只不过,是我们没有及时意识到这个数据量级,因此也就没有采取优化。

  

  要实现这样一个判断,不用求count,取一条记录的耗时就小到数个ms了。对应的SQL是:SELECT * FROM sbh_soho limit 1

  

  

  因此改一下逻辑。

  

public void executeJob(String jobParameter) {

 

   //获取风控个体工商业者信息表数据总计,如果没有任何数据,则需要初始化

   int sohoCount = sbhSohoManager.hasRecord();

   if (sohoCount == 0) {

   // 首次同步数据

   } else {

   // 非首次,增量同步数据

  }

 

  

  其中,sbhSohoManager#hasRecord 巧用mybatisplus的QueryWrapper#last("limit 1")实现SQL里的limit,定义如下

  

 /**

 

   * 仅判断表里有没有数据

   * @return

   public boolean hasRecord(){

   QueryWrapper SbhSoho objectQueryWrapper = new QueryWrapper ();

   objectQueryWrapper.last("limit 1");

   SbhSoho sbhSoho =getOne(objectQueryWrapper); //baseMapper.selectOne( null);

   return sbhSoho!=null;

   }

 

  View Code

  

  还有优化空间

  这是一个同步数据的job。定期从源库同步一个表的增量数据到当前库。

  基于此,作为高端程序员的你,也许会想到, 判断当前数据表里是否存在数据其实不用每次查库。
所以,内存/缓存又派上用场了。———————————— 另起一段。
当前JobService里定义一个static boolean 的field: isFirstTime,默认值为false。 job首次跑的时候.... ——还是写代码吧,描述起来太费脑子费文字费眼球还不易懂。

  

@Service

 

  public class SbhSohoSyncBizJobImpl {

   private static boolean isFirstTime = true;

   public void executeJob(String jobParameter) {

   if ( isFirstTime == true) {

   isFirstTime = ! CacheUtil.getCache("onlyoncekey" + getClass().getSimpleName(), TimeUnit.DAYS.toSeconds(30), () - sbhSohoManager.hasRecord());

   //获取风控个体工商业者信息表数据总计,如果没有任何数据,则需要初始化

   if (isFirstTime == true) {

   // 首次同步数据

   } else {

   // 非首次,增量同步数据

  }

 

  

  CacheUtil.getCache是利用Redist#get、Redis#set、Supplier T 封装一个缓存util方法。

  

  

  
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自,转载请注明原文链接:https:///buguge/p/16813967.html

  以上就是思路一转,春暖花开!动动手指,这段程序性能又双叒叕提升2s~15s()的详细内容,想要了解更多 思路一转,春暖花开!动动手指,这段程序性能又双叒叕提升2s~15s的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: