java切分查询数据库表

Posted xiaozw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java切分查询数据库表相关的知识,希望对你有一定的参考价值。

在实际应用中,我经常用到遇到根据单号查询,单号又是批量如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

  

 

以上是关于java切分查询数据库表的主要内容,如果未能解决你的问题,请参考以下文章

mycat读写分离+垂直切分+水平切分+er分片+全局表 测试

数据库分库分表

数据库分库分表

MyCat水平分库

MySQL切分查询用法分析

分库分表 --- 理论