Java基础、中级、高级、架构面试资料

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

SQL herman 7229浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

网友一般喜欢将 PostgreSQLMySQL 拿来对比,有的喜欢 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的倒下即可。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » PostgreSQL 排序后 Limit OFFSET 分页 串行 问题解决办法