CODE大全
您的位置 : 首页 > 前端在线资源 >

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

发布时间:『 2018-04-23

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

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

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

PostgreSQL 分页 串行 问题重现

首先 我们在 PostgreShttp://www.bdx-leb.com/3909/24174ff8fe2a.htmlQL 9.2 中新建一张 xttblog 表,该表的字段内容如下:

DROP TABLE IF EXISTS xttblog;
Chttp://www.bdx-leb.com/c214/239685b113ca.htmlREATE TABLE  xttblog(
	ID bigserial NOT null,
	name varchar(256) not nullhttp://www.bdx-leb.com/6593/c327f2a4f8eb.html,
	http://www.bdx-leb.com/c979/786b5573e19a.htmldesc 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 http://www.bdx-leb.com/021c/a6494cfdac48.html10 OFFSET 0;

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

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

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

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

业余草公众号

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


——— 全文完 ———
Powered by 张鑫旭 | 鄂ICP备14009759号-2 | 网站留言 Copyright © 2014-2016 张鑫旭 版权所有