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

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

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

该问题是PostgreSQL 9.2版本的一个问题,目前新的版本这个问题已被解决,可以说这是Poshttp://www.anbomei.com/9539/d36e88fc9f1f.htmltgreSQL的http://www.anbomei.com/3dea/b6c522a3010b.html一个bug。

PostgreSQL 分页 串行 问题重现

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

http://www.anbomei.com/0e14/ebd9e7ae7934.html
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),
	CONSThttp://www.anbomei.com/fe69/bacb78efe3be.htmlRAINT 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 http://www.anbomei.com/f216/9e6f39b46ef7.html的版本,到最新的9.5版本。

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

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!