性能優化說明:判斷數據表裡是否有數據,用limit 1/top 1取代求count 近期,數據中心系統負荷大,mysql伺服器的CPU動輒高達90%以上。代碼和數據表存在很大優化空間。 這裡分享一個定時同步數據的Job任務的優化過程。 先上代碼 public void executeJob(Stri ...
性能優化說明:判斷數據表裡是否有數據,用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