ShardingSphere分庫分表查詢


在經過 ShardingSphere分表與分庫分表 實現了分庫分表之后緊接着本文博主將要測試的就是在這種環境下如果我們寫查詢語句 ShardingSphere 發送的 SQL 是怎樣的是如何查詢的,規則是什么,讓我們拭目以待吧。

全查詢

首先來看看不帶任何條件的查詢結果測試代碼如下:

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

image-20211210144644017

為啥會對所有的庫和表進行查詢呢,原因其實也很簡單,因為 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);
}

運行測試方法,發現在一個數據源中查兩張表:

image-20211210145856693

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

image-20211210150241114

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

image-20211210161711765

image-20211210161655749

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

范圍查詢

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

運行測試代碼發現報錯了,報錯信息如下:

image-20211210164322498

inline 策略不支持范圍查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM