动动手指,这段程序性能提升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

动动手指,这段程序性能提升2s~15s

因此改一下逻辑。

public void executeJob(String jobParameter) {

    //获取风控个体工商业者信息表数据总计,如果没有任何数据,则需要初始化
    int sohoCount = sbhSohoManager.hasRecord();
    if (sohoCount == 0) {
        // 首次同步数据
        ...

    } else {
        // 非首次,增量同步数据
        ...

    }
}

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

动动手指,这段程序性能提升2s~15s
/**
     * 仅判断表里有没有数据
     * @return
     */
    public boolean hasRecord(){
        QueryWrapper 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

动动手指,这段程序性能提升2s~15s

动动手指,这段程序性能提升2s~15s

Original: https://www.cnblogs.com/buguge/p/16813967.html
Author: buguge
Title: 动动手指,这段程序性能提升2s~15s

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/685373/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Maven】如何构建maven项目;maven 核心知识

    maven 思维导图: ps:资料出处 — 动力节点资料广场 笔记第一部分: 1、传统开发项目的问题(没有使用maven管理的项目): 1)很多模块之间有关系,手工管理…

    技术杂谈 2023年7月10日
    081
  • 使用模板来解决接口继承问题

    一.定义2个有继承关系的接口 struct IA { virtual void Test1()=0; }; struct IB:public IA { virtual void T…

    技术杂谈 2023年5月31日
    084
  • 《三十年来寻剑客》灵云志勤禅师

    《三十年来寻剑客》灵云志勤禅师 三十年来寻剑客,几回落叶又抽枝。自从一见桃花后,直至如今更不疑。 Original: https://www.cnblogs.com/LittleH…

    技术杂谈 2023年5月31日
    0116
  • Gitee多分支提交被拒

    方法一首先 git log 查看commit记录, 找到远端本地冲突之前的commit git reset –soft [commitID] 1、git pull origin …

    技术杂谈 2023年6月21日
    0101
  • 部署-docker安装gitlab

    gitlab简单介绍 gitlab是一个私有的源代码管理系统,提供了web界面给用户进行访问和操作。gitlab存储的仓库是服务端的,需要跟本地的仓库进行配合使用,而本地的仓库管理…

    技术杂谈 2023年7月23日
    085
  • tolua杂记

    1 字符串调用luaFunc :DoString public class CallLuaFunction : MonoBehaviour { private string scr…

    技术杂谈 2023年5月31日
    085
  • 简单易懂讲注解

    注解是什么 简单的说,注解就是一种将元数据信息从 xml 剥离开来,然后保存在 java 源代码中,这将使得代码更加清晰易懂,无需维护两个地方: java 源代码以及 xml 配置…

    技术杂谈 2023年7月25日
    0104
  • 数据结构:跳跃链表

    关注公众号,一起交流,微信搜一搜: 潜行前行 什么是跳跃链表 开发时经常使用的平衡数据结构有B数、红黑数,AVL数。但是如果让你实现其中一种,很难,实现起来费时间。而跳跃链表一种基…

    技术杂谈 2023年7月25日
    094
  • Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系

    屏幕坐标系:以屏幕的左上角为原点,如图所示GetWindowRect() 函数获得的 RECT 就是以屏幕坐标系算的。 非客户区坐标系(窗口坐标系)包括标题栏的部分。GetWind…

    技术杂谈 2023年5月31日
    095
  • source insight4.0最常用到的设置

    1、常用功能 1.1:全局查找 1.2:当前文件查找 1.3:高亮设置 1.4:配置字体以及其他 1.5:配置自动缩进 1.6:其他 1. 常用功能 全局查找 Ctl+/ 查找到的…

    技术杂谈 2023年6月21日
    097
  • flink metric库的使用和自定义metric-reporter

    flink内部实现了一套metric数据收集库。 同时flink自身系统有一些固定的metric数据, 包括系统的一些指标,CPU,内存, IO 或者各个task运行的一些指标。具…

    技术杂谈 2023年6月21日
    0108
  • 002 Linux 文件与目录命令的必会姿势!

    文件及目录的路径切换、显示、创建、复制、移动和删除操作的常用姿势,必会!因为这些命令是使用 Linux 系统进行工作的基础,是摆脱小白的第一步,是构建大厦的基石!发现锅锅真是个话痨…

    技术杂谈 2023年7月10日
    0119
  • 学习

    1.1、参考博客 参考的教程如下: Original: https://www.cnblogs.com/agui125/p/16032402.htmlAuthor: 风御之举Tit…

    技术杂谈 2023年6月21日
    0100
  • python爬虫之抓取小说(逆天邪神)

    2022-03-06 23:05:11 申明:自我娱乐,对自我学习过程的总结。 环境: 项目目标: 最终效果:都已实现。可以判断小说更新了没;更新了就下载下来;通过调整小说的已看章…

    技术杂谈 2023年7月11日
    0104
  • 轻松理解CAP理论

    Consistency: Every read receives the most recent write or an errorAvailability: Every requ…

    技术杂谈 2023年5月31日
    0141
  • redis

    Nosql概述 因为数据的访问量越来越大,单靠关系型数据库已经无法支撑用户需求,所以架构也在用户的需求下一步步进行演进。 1、单机Mysql时代 90年代,一个网站的访问量一般不会…

    技术杂谈 2023年7月11日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球