概述
所謂分頁查詢就是從符合條件的起始記錄,往後周遊“頁大小”的行。資料庫的分頁是在server端完成的,避免用戶端一次性查詢到大量的資料,讓查詢資料資料分段展示在用戶端。對于Phoenix的分頁查詢,怎麼使用?性能怎麼樣?需要注意什麼?将會在文章中通過示例和資料說明。
二、分頁查詢
1. 文法說明
[ LIMIT { count } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
Limit或者Fetch在order by子句後轉化為為top-N的查詢,其中offset子句表示從開始的位置跳過多少行開始掃描。
對于以下的offsset使用示例, 我們可發現當offset的值為0時,查詢結果從第一行記錄開始掃描limit指定的行數,當offset值為1時查詢結果從第二行記錄開始開始掃描limit指定的行數...
0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK from STORE_SALES where SS_ITEM_SK < 3600order by SS_ITEM_SK limit 6; +-----------------+ | SS_CUSTOMER_SK | +-----------------+ | 109734 | | null | | 168740 | | 344372 | | 249078 | | 241017 | +-----------------+ 6 rows selected (0.025 seconds) 0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK limit 3 offset 0; +-----------------+ | SS_CUSTOMER_SK | +-----------------+ | 109734 | | null | | 168740 | +-----------------+ 3 rows selected (0.034 seconds) 0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK limit 3 offset 1; +-----------------+ | SS_CUSTOMER_SK | +-----------------+ | null | | 168740 | | 344372 | +-----------------+ 3 rows selected (0.026 seconds) 0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK limit 3 offset 2; +-----------------+ | SS_CUSTOMER_SK | +-----------------+ | 168740 | | 344372 | | 249078 | +-----------------+ 3 rows selected (0.017 seconds) 0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK limit 3 offset 3; +-----------------+ | SS_CUSTOMER_SK | +-----------------+ | 344372 | | 249078 | | 241017 | +-----------------+ 3 rows selected (0.024 seconds)
2. 文法示例
SELECT * FROM TEST LIMIT 1000; SELECT * FROM TEST LIMIT 1000 OFFSET 100; SELECT * FROM TEST FETCH FIRST 100 ROWS ONLY;
三、性能測評
我們對如下SQL的limit子句進行性能得到以下結論。
select SS_CUSTOMER_SK from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK limit <m> offset <n>
結論1:當limit的值一定時,随着offset N的值越大,查詢性基本會線性下降。
結論2:當offset的值一定時,随着Limit的值越大,查詢性能逐漸下降。當limit的值相差一個數量級時,查詢性能也會有幾十倍的差距。
四、最後
大多數場景中分頁查詢都是和order by子句一起使用的, 在這裡需要注意的是,order by的排序字段最好是主鍵,否則查詢性能會比較差。(這部分最好是在做業務層設計時就能考慮到)分頁查詢需要根據使用者的實際需求來設計,在現實産品中,一般很少有上萬行每頁的需求,頁數太大是不合理的,同時頁數太多也是不合理的。度量是否合理,仍需要根據實際需求出發。