背景:
新功能上线发现分页出现了问题,分析了一段时间发现是mysql的问题,mysql对字段相同值排序后再分页数据会不准确。
问题描述:
例子使用的mysql版本是5.6.31
举个简单的例子,数据表t如下:
A | B |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 2 |
7 | 2 |
8 | 2 |
进行下一页查询时
select A,B from t order by B limit 0,2;
会出现:
A | B |
---|---|
1 | 1 |
8 | 2 |
再进行下一页查询
select A,B from t order by B limit 2,2;
会出现:
A | B |
---|---|
3 | 2 |
8 | 2 |
再进行下一页查询
select A,B from t order by B limit 4,2;
会出现:
A | B |
---|---|
7 | 2 |
8 | 2 |
再进行下一页查询
select A,B from t order by B limit 6,2;
会出现:
A | B |
---|---|
4 | 4 |
5 | 5 |
可以看出,当b列的值为2时,mysql分页得到的数据和想要的数据并不匹配
原因分析:
在mysql中,如果排序的字段值都不同还好,这样分页不会出错,但是如果排序的字段值相同,那么mysql就不知道如何分页了,查询出的数据就会有问题。
解决方案:
看一下表中,是否还有不唯一的列值,将这个列也加入到排序中
这里可以将sql调整成
select A,B from t order by B,A limit 0,2;
此时再进行分页,数据就不会出现问题了。
ps: 另外,这个问题与mysql的版本有关系,在5.1版本,针对有字段相同的数据排序分页并没有出现问题,但是5.6版本却有分页查询数据不准确的问题。
不管怎样,对多个字段排序再分页都是没问题的,所以,最好都仔细检查一下分页sql中是否有对字段进行排序,如果排了序,最好还是再添加排序字段,这样能保证不出问题。