网友一般喜欢将 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 分页 串行 问题解决办法
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/252356.html