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的性能優化策略
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章