分頁常適用於性能優化,如以下場景:
- 業務只需要獲取部分數據,如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
該句語義爲從指定偏移位置開始返回,一共返回多少行。
offset
從0
開始,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的性能優化策略