天天看點

ShardingSphere分庫分表查詢

在經過 ​​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分庫分表查詢

如上在一個庫當中查詢了兩張表的原因就是因為我們是按照 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分庫分表查詢

經過對查詢結果的觀察發現,庫反而又不确定了,表反而确定了,原因就是我們的分庫規則是按照 goods_id 進行計算的,我們指定的查詢條件為 tid 是以就能精準的确定到具體的某張表。那麼如果想要達到精确的某個庫某張表的話就需要将分庫與分表的邏輯字段改為利用同一個即可,那麼緊接着就來開始測試一下,我們将分庫按照 goods_id 的政策更改為按照 tid 然後再次運作測試代碼:

ShardingSphere分庫分表查詢
ShardingSphere分庫分表查詢

如上圖已經是精準的某個庫當中的某一張表了,那麼在以後的開發當中最好就是以一個字段來作為分庫分表的算法字段這樣就可以高效的精準到具體的庫和表進行查詢。

範圍查詢

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

運作測試代碼發現報錯了,報錯資訊如下:

ShardingSphere分庫分表查詢

​inline​

​ 政策不支援範圍查詢

繼續閱讀