PostgreSQL 排序后 Limit OFFSET 分页 串行 问题解决办法

网友一般喜欢将 PostgreSQL 和 MySQL 拿来对比,有的喜欢 MySQL 多一些,有的喜欢 PostgreSQL 多一些。它们各有各的好处,但是在国内还是 MySQL 更活跃一些,这离不开 BAT 的支持,也一些 MySQL 延伸 数据库 的诞生,还有就是去IOE的口号出来后,MySQL 得到了更强的支持。

由于公司响应国家的号召,对系统的安全性等方面支持,整个公司的多个项目需要同时采用多种数据库。简单来说就是每个项目采用一种数据库,各个项目的数据库不能都一样。这样我们的项目就被采用了 PostgreSQL 数据库。在使用的过程中,我们发现分页数据,每次数据都会串行。这其实是一个非常严重的问题,最开始我们以为是分页代码写的有问题。经过一番排除后,最终确认是 PostgreSQL 的问题。今天我就这类问题给大家做一个分享!

该问题是PostgreSQL 9.2版本的一个问题,目前新的版本这个问题已被解决,可以说这是PostgreSQL的一个bug。

PostgreSQL 分页 串行 问题重现

首先 我们在 PostgreSQL 9.2 中新建一张 xttblog 表,该表的字段内容如下:

DROP TABLE IF EXISTS xttblog;
CREATE TABLE  xttblog(
	ID bigserial NOT null,
	name varchar(256) not null,
	desc varchar(256) not null,
	create_date  DATE not null,
	title varchar(256),
	CONSTRAINT xttblog_pk PRIMARY key(ID)
);

然后在该表中插入 26 条数据,name 分别从 字母a 到z。然后我们编写SQL 进行分页查询。分页SQL 代码如下:

SELECT * FROM xttblog where 1=1 order by name desc limit 10 OFFSET 0;

理论上我们分页到第二页的时候,数据会从第11条显示到第20条,然而现象并非如此,而是从第7条展示到17条。这样的数据完全不是我们想要的,而且系统也出现难以预估的问题。

百度了很久也没有最终的答案,后来在阿里巴巴的朋友告诉我,他们遇到过这类问题,阿里巴巴内部培训已经将此类问题着重强调了。下面我将解决办法贴出来:

第一种办法也是最笨的办法,就是升级 PostgreSQL 的版本,到最新的9.5版本。

第二种办法是在排序的字段上加上主键,或者组合排序的字段最终能形成一个唯一约束的记录。例如我这里在order by 后边在加上 ID的倒下即可。

PostgreSQL 排序后 Limit OFFSET 分页 串行 问题解决办法

: » PostgreSQL 排序后 Limit OFFSET 分页 串行 问题解决办法

原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/252356.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论