[Phoenix] 九、分页查询

概述

所谓分页查询就是从符合条件的起始记录,往后遍历“页大小”的行。数据库的分页是在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的值越大,查询性基本会线性下降。

[Phoenix] 九、分页查询

结论2:当offset的值一定时,随着Limit的值越大,查询性能逐步下降。当limit的值相差一个数量级时,查询性能也会有几十倍的差距。
[Phoenix] 九、分页查询

四、最后

大多数场景中分页查询都是和order by子句一起使用的, 在这里需要注意的是,order by的排序字段最好是主键,否则查询性能会比较差。(这部分最好是在做业务层设计时就能考虑到)分页查询需要根据用户的实际需求来设计,在现实产品中,一般很少有上万行每页的需求,页数太大是不合理的,同时页数太多也是不合理的。度量是否合理,仍需要根据实际需求出发。

参考

上一篇:SolrCloud空间搜索测试


下一篇:记第一次使用云服务器