性能优化说明:判断数据表里是否有数据,用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方法。


描述恺撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:原文:ABCDEFGHIJKLMNOPQRSTUVWXYZ
在使用Rubyv2.2.2的ElCapitan(MacOSX10.11.1)上安装Rails时,出现以下错误:ERROR:Errorinstallingnokogiri:ERROR:Failedtobuildgemnativeextension./Users/jon/.rvm/rubies/ruby-2.2.2/bin/ruby-r./siteconf20151117-26799-ux15fd.rbextconf.rb--use-system-librariescheckingiftheCcompileraccepts...***extconf.rbfailed***Couldnotc
今天想要跟着沐神学习一下循环神经网络,在跑代码的时候,d2l出现了问题,这里记录一下解决的过程,方便以后查阅。李沐《动手学深度学习》d2l——安装和使用安装d2l解决Import“...“couldnotberesolved问题PermissionError:[WinError5]拒绝访问。:'..\\\data'安装d2l下载whl:https://www.cnpython.com/pypi/d2l/dl-d2l-0.15.1-py3-none-any.whl将下载的文件放到这里:在这个文件中右键,选择“在终端中打开”在终端中输入如下命令:condaactivatepytorch_envpi
代码请进行一定修改后使用,本代码保证100%通过率,本题目提供了java、python、c++三种代码。复盘思路在文章的最后题目描述祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区;整体上常年光照良好,但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站,生产清洁能源对每平方公里的土地进行了发电评估,其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益。输入描述第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长最低要求的发电量之后每行为
最近更新的博客华为OD机试-卡片组成的最大数字(Python)|机试题算法思路华为OD机试-网上商城优惠活动(一)(Python)|机试题算法思路华为OD机试-统计匹配的二元组个数(Python)|机试题算法思路华为OD机试-找到它(Python)|机试题算法思路华为OD机试-九宫格按键输入(Python)|机试算法备考思路华为OD机试-身高排序(Python)|备考思路使用说明参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。华为OD清单查看地址:blog.csdn.net/hihell/catego
我有一段文本需要扫描,每行至少包含2部分信息,有时包含4部分信息。问题是每一行可能是15-20种不同操作中的一种。在ruby中,当前代码看起来像这样:text.split("\n").eachdo|line|#around20times................expressions['actions'].eachdo|pat,reg|#around20times.................这显然是“问题所在”。通过将所有正则表达式合并为一个,我确实设法使其更快(在C++中提高了50%),但这仍然不是我需要的速度——我需要快速解析数千个这些文件!现在我将它们与正则表达式
提示:这里提供selenium破解验证码的思路,使用打码平台从而破解验证码文章目录文章目录一、第一步剖析平台验证码类型二、编写selenium代码1.引入库所需要的模块2.定义一个初始属性3.找到账户登录的元素然后点击4.短信验证登录5.找到手机号输入框6.输入手机号之后会有这样类型的验证码7.找到验证码1图片的url地址8.找到验证码2图片的url地址9.现在可以按照思路编写代码了10.获取到两张验证码的url下载它们11.合成两张图片为一张图片 12.合成图片之后就变成了13.接入打码平台然后把合成好的图片上传到接口14.处理好坐标数据之后就模拟人的操作来点击验证码编辑
在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替了传统的机械式密码锁,电子密码锁具有安全性高、成本低、功耗低、易操作等优点。本文主要介绍运用51单片机设计数字密码锁的方法。本设计采用自上而下的数字系统设计方法,将数字密码锁系统分解为若干子系统,并且进一步细划为若干模块,然后用C语言来设计这些模块,通过KEIL软件编译,并且进行实机调试。调试结果表明:该数字密码锁能够效验4位十进制
使用RVM,我尝试在安装Fedora15后安装ree-1.8.7-2011.03,但出现以下错误。在Ubuntu11.04上使用rvminstallree-1.8.7-2011.03工作正常..与Fedora15上的MRIruby-1.8.7-p334相同的错误(和解决方案)。关于如何解决这个问题有什么想法吗?make[1]:Enteringdirectory`/home/ryguy/.rvm/src/ree-1.8.7-2011.03/source/ext/dl'gcc-I/opt/local/include-I.-I/opt/local/include-I../..-I../.
有没有一种简单的方法可以将时间四舍五入到最接近的15分钟?这就是我目前正在做的事情。有更简单的方法吗?t=Time.newrounded_t=Time.local(t.year,t.month,t.day,t.hour,t.min/15*15) 最佳答案 您说的是“向下舍入”,所以我不确定您实际上是在寻找回合数还是底数,但这是执行这两项操作的代码。如果将round_off和floor方法添加到Time类,我认为这样的内容读起来真的很好。额外的好处是您可以更轻松地按任何时间分区舍入。require'active_support/cor