PostgreSQL Limit分页写法

分页常适用于性能优化,如以下场景:

  • 业务只需要获取部分数据,如top 10,此时查询所有数据到客户端,浪费数据库磁盘IO/网络IO、应用内存
  • 数据量太大,传输时间可能过长甚至中断、查询到客户端内存开销巨大,每次只查询较小数量的行,分多次查询

PostgreSQL中使用limit实现分页查询。
语法与MySQL类似,下面会对比说明(MySQL Limit语法可参考《MySQL分页查询》)。

基本语法

SELECT * FROM table 
LIMIT {row_count | row_count OFFSET offset}

如上所示,LIMIT有两种用法。

LIMIT row_count OFFSET offset

该句语义为从指定偏移位置开始返回,一共返回多少行。
offset0开始,offset 0表示从第一行开始获取。

例:SELECT * FROM tbl LIMIT 5,10,表示从第6行开始返回、一共返回10行。

这与MySQL的语法相同。

LIMIT row_count

等价于LIMIT 0 OFFSET row_count

这与MySQL的语法相同。

与MySQL的不同

语法差异

MySQL支持LIMIT offset, row_count的简略写法。如LIMIT 5,10等价于 LIMIT 10 OFFSET 5
因此如果考虑兼容,不推荐使用MySQL的简略写法,尽可能使用LIMIT row_count OFFSET offset的写法。

分布式存储场景下的顺序

以笔者在用的阿里云Holo(交互式分析)为例,使用PostgreSQL引擎管理ODPS的分布式存储数据。因为数据按块存储、且未建立索引,每次MapReduce后拿到的数据顺序是不确定的,这样Limit拿到的数据并不连续、甚至可能重复(如多次查询第一页,返回的数据也是不同的)。
MySQL因为索引本身有序、无二级索引时也有聚集索引约束,所以顺序是稳定的。


以上。

待更新内容:

  • PostgreSQL的limit实现原理、有否类MySQL的性能优化策略

你可能感兴趣的:(#,└,PostgreSQL,待更新)