MySQL排序字段数据相同不能分页问题

Posted smileNicky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL排序字段数据相同不能分页问题相关的知识,希望对你有一定的参考价值。

mysql排序字段数据相同不能分页问题,最近同事遇到一个列表的分页有bug,点击第1行,第2行数据会出现重复的,初步怀疑是数据重复了,通过SQL查询,确认数据都没重复。

不过分页时候会出现重复,所以怀疑是分页问题,因为我之前遇到过order by的字段有null值的情况,排序也会有问题,所以通过经验去排查排序的字段数据,发现并没有null值的数据。

只是数据很多都是一样的,因为是通过批量导入的,新增时间都保存为一样的,然后分页再根据这个新增时间去排序,就会出现好像“数据重复”的现象

通过查询MySQL官方的资料,https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html,找到下面关键的信息:

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

大致意思是,如果order by排序的字段有相同的数据,则服务器可以自由地以任何顺序返回这些行,并且可能会根据整体执行计划以不同的方式返回。

所以,问题就知道了,通过官网资料,可以知道可以在order by后面加上一个唯一的id

mysql> SELECT * FROM ratings ORDER BY category, id;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
|  1 |        1 |    4.5 |
|  5 |        1 |    3.2 |
|  3 |        2 |    3.7 |
|  4 |        2 |    3.5 |
|  6 |        2 |    3.5 |
|  2 |        3 |    5.0 |
|  7 |        3 |    2.7 |
+----+----------+--------+

mysql> SELECT * FROM ratings ORDER BY category, id LIMIT 5;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
|  1 |        1 |    4.5 |
|  5 |        1 |    3.2 |
|  3 |        2 |    3.7 |
|  4 |        2 |    3.5 |
|  6 |        2 |    3.5 |
+----+----------+--------+

当然,方法并非唯一,也可以新增数据时候,保证这个字段数据不相同,比如批量新增时间可以加1s,避免重复

通过网上资料,还找到可以加上索引的方法处理,这个问题虽然不是自己遇到过,不过挺有意思的,所以记录起来

以上是关于MySQL排序字段数据相同不能分页问题的主要内容,如果未能解决你的问题,请参考以下文章

sql中order by 待排序的字段值相同时,发生分页出现重复数据的问题

sql中order by 待排序的字段值相同时,发生分页出现重复数据的问题

Mysql查询使用limit分页,同时使用order by可能产生的问题

MySql数据库,查询数据导出时会出现重复的记录(数据越多越明显)

开发随笔——mysql分页出现重复数据

解决mysql分页数据错乱问题