查询和删除问题
原创大约 2 分钟
查询
为了验证分库分表
之后的查询效果,可以来做个测试,分别验证一下通过分片键
执行查询和不通过分片键
的简单查询。
通过数据库终端从itechthink_order_0
、itechthink_order_1
和itechthink_order_2
这三个数据库中任意选择一张t_order
表的任意一条数据,拷贝它的分片键
字段id
和普通字段tradeno
的值。
然后修改ShardingJDBCTest
测试类,加入如下测试方法。
/**
* 通过分片键id字段查询
*
*/
@Test
public void testPartitionKeySelect() {
orderMapper.selectList(new QueryWrapper<Order>().eq("id", 1823268069208842242L));
// 三个不同库中的数据
orderMapper.selectList(new QueryWrapper<Order>().in("id", Arrays.asList(1823268069208842242L, 1823268072451039234L, 1823268072543313922L)));
}
/**
* 无分片键的查询
*
*/
@Test
public void testNoPartitionKeySelect() {
orderMapper.selectList(new QueryWrapper<Order>().eq("tradeno", "20e9c43230614b62b5bc861e9d19"));
orderMapper.selectList(new QueryWrapper<Order>().in("tradeno", Arrays.asList("20e9c43230614b62b5bc861e9d19")));
}
从结果可以看到,有没有分片键
查询效果是不一样的。
有
分片键
会非常准确地定位到数据所在的库
和表
,查询三个不同库中的数据时仅执行了3条SQL
语句。无
分片键
则会查询所有的库和表,仅仅查询一条记录就执行了6条SQL
语句,因为它要在6张不同的表中查询数据,执行了所谓的全库路由
。
删除
和查询一样,修改ShardingJDBCTest
测试类,加入如下测试方法。
/**
* 通过分片键id字段删除
*
*/
@Test
public void testPartitionKeyDelete() {
orderMapper.delete(new QueryWrapper<Order>().eq("id", 1823268069208842242L));
orderMapper.delete(new QueryWrapper<Order>().in("id", Arrays.asList(1823268069208842242L, 1823268072451039234L, 1823268072543313922L)));
}
/**
* 无分片键的删除
*
*/
@Test
public void testNoPartitionKeyDelete() {
orderMapper.delete(new QueryWrapper<Order>().eq("tradeno", "20e9c43230614b62b5bc861e9d19"));
orderMapper.delete(new QueryWrapper<Order>().in("tradeno", Arrays.asList("20e9c43230614b62b5bc861e9d19")));
}
删除表现出来的结果和查询一样,有分片键
和没有分片键
的删除效率是完全不同的。
有
分片键
会精准地定位到数据所在的库
和表
。没有
分片键
则会执行全库路由
。
感谢支持
更多内容,请移步《超级个体》。