Java中少用select count(*),换个方式就会发现天差地别的变化

8 篇文章 0 订阅
3 篇文章 0 订阅

一、业务场景

通常,我们在业务代码中要判断某张表是否存在数据,持久化查询的业务代码通常会这样写

int count = testMapper.countByExample(example);
if(count > 0){
	//有数据, do something
}else{
	//没有数据, do other thing
}

mabatis-generator自动生成的xml中,countByExample通常如下

<select id="countByExample" parameterType="org.test.db.domain.ucUserExample" resultType="java.lang.Long">    
    select count(*) from uc_user
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </select>

数据不多的时候,count() 是完全ok的啦。然而,当我们这张uc_user表特别大时候,select count(*)真的太慢了! 假设,uc_user表中有25w+的数据行, 我们执行 count(),再SHOW PROFILES,可看到如下
在这里插入图片描述
在这里插入图片描述

二、优化查询

我们可以使用下面语句来判断某表是否存在数据,我们再用show profiles看看效果。发现快了好多!!!后续,我们业务代码中可以愉快的执行啦~(mapper文件对应的返回类型可能要替换为object类型)

select  1  from test.uc_user LIMIT 1;

效果图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值