性能優化說明:判斷資料表里是否有資料,用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,

優化方案
要實作這樣一個判斷,不用求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://www.cnblogs.com/buguge/p/16813967.html
<style>hr.signhr{width:80%;margin:0 auto;border: 0;height: 4px;background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0))}</style>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518820.html
標籤:Java
上一篇:為了講明白繼承和super、this關鍵字,群主發了20塊錢群紅包
下一篇:java基礎-->概述部分
