在实际应用中,我经常用到遇到根据单号查询,单号又是批量如1000个单号,直接1000个in子查询是不行的,子查询是用上限的。如果表中数据达到上百万以上。即使有单号字段有索引查询也是很慢。这时可以用切分。把1000个单号切分成,每300个去查询。这样会快很多。下面是demo。
1 /** 2 * 准备工作,插入数据,100000条记录。 3 */ 4 @Test 5 public void test11() { 6 for (int i = 0; i < 100000; i++) { 7 UserInfo userInfo = new UserInfo(); 8 //生成随机数单号(1到100000)。 9 Random random = new Random(); 10 int max = 100000; 11 int min = 1; 12 int s = random.nextInt(max) % (max - min + 1) + min; 13 14 userInfo.setAge(random.nextInt(90) + 10); 15 userInfo.setName("张三" + i); 16 userInfo.setBillCode("" + s); 17 userInfoMapper.insertSelective(userInfo); 18 } 19 } 20 21 /** 22 * 查询数据,如查询1000个单号,每300个拆分。最后把结果集合并。 23 */ 24 @Test 25 public void test12() { 26 //结果集 27 List<UserInfo> result=Lists.newArrayList(); 28 List<String> listSearch = Lists.newArrayList(); 29 for (int i = 1; i <= 1000; i++) { 30 listSearch.add(i+""); 31 } 32 //按每300个拆分。只需查询3次数据库,用in查询。 33 List<List<String>> listOne = Lists.partition(listSearch, 300); 34 for (List<String> one : listOne) { 35 UserInfoExample example=new UserInfoExample(); 36 example.createCriteria().andBillCodeIn(one); 37 List<UserInfo> oneUserInfo= userInfoMapper.selectByExample(example); 38 result.addAll(oneUserInfo); 39 } 40 //输出 41 for(UserInfo userInfo:result){ 42 System.out.println("显示:"+JSON.toJSONString(userInfo)); 43 } 44 }
输出:
源码下载地址:
链接:https://pan.baidu.com/s/1hFq9DefyFMKgrk06iJylXw
提取码:fx4o