文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用shardingSphere做mysql分库分表(2) 之多表联查遇到的问题

2017-06-23 23:58

关注

2019年11月20日星期三

试试基于shardingSphere能不能多表联查

 

分表在两个tmp_order库中创建test_order_item0和test_order_item1

 

create database if not exists tmp_order_item CHARACTER SET "utf8" COLLATE "utf8_general_ci";

USE tmp_order;

DROP TABLE IF EXISTS `test_order_item1`;

CREATE TABLE `test_order_item1` (

  `id` varchar(255) NOT NULL COMMENT "主键",

  `orderNo` varchar(255) DEFAULT NULL COMMENT "订单编号",

  `goodsName` varchar(255) DEFAULT NULL,

  `createdTime` datetime DEFAULT NULL,

  `updatedTime` datetime DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

然后把分表策略设置一下:

 










   
       
           
           
       

   

 

分库策略改成根据id取模

分表策略使用orderNo 取模

之前的分库策略是根据userId取模,但是userId字段只在test_order表中又,在test_order_item表中没有,所以出了错误,再向test_order_item表插入数据的时候,只插入到了一个库中的两张表中,另一个库中的两张表插入了上一个库中的全量数据做了备份,这块需要找时间再记录一下,这里就不再记录了

 

为了监控sql,把数据源换成德鲁伊:

 


   
   
   
   
   



   
   
   
   
   

 

德鲁伊的配置不是重点就不帖了。

 

因为分库策略调整了,把所有数据清空重新插入。

 

在test_order表中插入10条数据,再在test_order_item中以test_order表中的orderNo为关联字段,每个orderNo 再插入3条数据,所以就是10*3=30条数据。代码

 

两段主要代码:

 

@Test
public void insert() {
   
for (int i = 0; i < 10; i++) {
        Order order =
new Order();
       
order.setId(IdWorker.getId());
       
order.setUserId(RandomUtils.getRandomString(6));
       
order.setAliTradeNo(RandomUtils.getRandomString(8));
       
order.setAmount(new BigDecimal(100));
       
order.setCreatedTime(new Date());
       
order.setGoodsId("1");
       
order.setNum(100);
       
order.setOrderNo(RandomUtils.getRandomString2(8));
       
order.setUpdatedTime(new Date());
       
order.setStatus(1);
       
order.setStockId("20");
       
System.out.println(orderService.insert(order));
   
}

 

 

@Test
public void insert() {
    List orders =
orderService.findAllOrders();
    for
(Order order : orders) {
       
for (int i = 0; i < 3; i++) {
            saveOrderItem(order.getOrderNo())
;
       
}
    }
}



private void saveOrderItem(String orderNo) {
    OrderItem orderItem =
new OrderItem();
   
orderItem.setCreatedTime(new Date());
   
orderItem.setUpdatedTime(new Date());
   
orderItem.setGoodsName(RandomNameUtils.getRandomJianHan(5));
   
orderItem.setId(IdWorker.getId());
   
orderItem.setOrderNo(orderNo);
   
orderItemService.insert(orderItem);
}

 

现在配置信息和数据都有了,开始编写查询语句:

 

先做个普通的根据test_order_item表中的orderNo 字段 查出 test_order_表中的userId和test_order_item表中的goodsName 和 orderNo;

 

Sql: