在经过 ​​ShardingSphere分表与分库分表​​ 实现了分库分表之后紧接着本文博主将要测试的就是在这种环境下如果我们写查询语句 ShardingSphere 发送的 SQL 是怎样的是如何查询的,规则是什么,让我们拭目以待吧。

全查询

首先来看看不带任何条件的查询结果测试代码如下:

@Test
void queryAll() {
this.orderMapper.selectList(null).forEach(System.out::println);
}

ShardingSphere分库分表查询_运行测试

为啥会对所有的库和表进行查询呢,原因其实也很简单,因为 ShardingSphere 它并不能明确的确定所查询的内容在哪个库当中所以就会进行全查询。

条件查询

指定条件查询

在看指定条件查询之后首先需要明确一点,我们分库是按照 goods_id 进行的分库算法,分表按照的是 tid 进行的分表算法,所以在这里我会足一的分开进行演示测试来看看 ShardingSphere 发送的 SQL 语句是怎样的,首先从 goods_id 开始:

@Test
void getOrderByGoodsId() {
QueryWrapper<Order> qw = new QueryWrapper<>();
qw.eq("goods_id", 1005);
this.orderMapper.selectList(qw).forEach(System.out::println);
}

运行测试方法,发现在一个数据源中查两张表:

ShardingSphere分库分表查询_分表_02

如上在一个库当中查询了两张表的原因就是因为我们是按照 goods_id 进行的分库,所以就可以精确到具体需要所查询的库,但是不能精确的知道是哪张表,如上就是按照 goods_id 作为查询条件的查询结果,紧接着来看看利用 tid 作为查询条件进行查询,那么查询结果又会是怎样呢:

@Test
void getOrderByTid() {
QueryWrapper<Order> qw = new QueryWrapper<>();
qw.eq("tid", 676006593589940225L);
this.orderMapper.selectList(qw).forEach(System.out::println);
}

ShardingSphere分库分表查询_ShardingSphere_03

经过对查询结果的观察发现,库反而又不确定了,表反而确定了,原因就是我们的分库规则是按照 goods_id 进行计算的,我们指定的查询条件为 tid 所以就能精准的确定到具体的某张表。那么如果想要达到精确的某个库某张表的话就需要将分库与分表的逻辑字段改为利用同一个即可,那么紧接着就来开始测试一下,我们将分库按照 goods_id 的策略更改为按照 tid 然后再次运行测试代码:

ShardingSphere分库分表查询_运行测试_04

ShardingSphere分库分表查询_分表_05

如上图已经是精准的某个库当中的某一张表了,那么在以后的开发当中最好就是以一个字段来作为分库分表的算法字段这样就可以高效的精准到具体的库和表进行查询。

范围查询

@Test
void getOrderBetween() {
QueryWrapper<Order> qw = new QueryWrapper<>();
qw.between("tid", 676006593589940225L, 676006593589940229L);
this.orderMapper.selectList(qw).forEach(System.out::println);
}

运行测试代码发现报错了,报错信息如下:

ShardingSphere分库分表查询_分表_06


​inline​​ 策略不支持范围查询