总结:分页查询有两种:RVC和常规分页(offset+limit);两者的最大区别是:前者高效复杂,后者低效但是简单。
Phoenix支持标准的SQL结构启用分页查询。
- 行值构造函数(RVC,Row Value Constructors)
- OFFSET加limit
行值构造函数(RVC)
行值构造函数是由括号分隔的有序值序列。
例子:
(4, 'foo', 3.5)
('Doe', 'Jane')
(my_col1, my_col2, 'bar')
就像正规的值,行值构造函数将会比较表达式,如下:
WHERE (x,y,z) >= ('foo','bar')
WHERE (last_name,first_name) = ('Jane','Doe')
行值构造函数在概念上将这些值连接在一起并互相比较,最左边的部分最重要。SQL-92标准的8.2(比较判断式)小结中详细解释了这一点,但是下面是一些计算结果为true的判断式例子:
(9, 5, 3) > (8, 8)
('foo', 'bar') < 'g'
(1,2) = (1,2)
行值构造函数将会被用于在IN的列表表达式中去高效率的查询一个复合主键列的集合。举例,下面将优化成一个指向获取三条记录:
WHERE (x,y) IN ((1,2),(3,4),(5,6))
行值构造函数的另一个主要用例是支持查询更多类型的功能,方法是允许逐步递增地遍历一组有序的行。例如,下面的查询将遍历一组行,一次20行:
SELECT title, author, isbn, description
FROM library
WHERE published_date > 2010
AND (title, author, isbn) > (?, ?, ?)
ORDER BY title, author, isbn
LIMIT 20
假设客户端绑定了三个可变参数到最后处理的行,下次调用用将匹配下20行数据擦好像,如果你在行值构造函数提供的列与主键(或者二级索引)的列顺序匹配,那么Poenix将有能力转换成行值构造函数表达式转换为扫描的开始行。这是非常有效的机制能够定位到行或者行之后。
OFFSET 加 LIMIT
使用OFFSET去指定查询返回的结果集中的起始行偏移,使用LIMIT指定页面大小。
例如,如果页面大小为10,那么要选择第二个页面,可以使用以下查询(从11返回到20的行):
SELECT title, author, isbn, description
FROM library
WHERE published_date > 2010
ORDER BY title, author, isbn
LIMIT 10 OFFSET 10
根据查询的类型,偏移读取和跳过服务器或客户机上的行,而RVC对于读取主轴上的查询是高效的,因为它可以简单地从提供的键开始。