问题
有一个分页查问用户的接口,原本曾经通过测试并且上线运行了。忽然在测试环境报BUG,每一页有不同水平的数据反复,例如,第一页有张三,第三页又呈现张三了。
次要的代码如下:
PageMethod.startPage(query.getCurrPage(), query.getPageSize());
List<User> users = userMapper.pages(query);
return new PageInfo<>(users);
第一反馈是,可能 MyBatis-Plus
出问题了,或者是应用谬误了。
MyBatis-Plus 官网文档举荐的形式,和出问题的代码统一(版本不同)
//第二种,Mapper接口方式的调用,举荐这种应用形式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);
那么问题只可能呈现在SQL
上
剖析SQL
表构造如下:
CREATE TABLE `gov_contract_customer_relation` (
`id` bigint NOT NULL AUTO_INCREMENT,
`no` varchar(50) NOT NULL COMMENT '编号',
`name` varchar(50) NOT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年龄',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创立工夫',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `no_UNI_IDX` (`no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';
呈现问题的分页SQL
如下:
SELECT
*
FROM t_user
WHERE age > 20
ORDER BY create_time DESC
LIMIT 0, 10;
问题体现为 LIMIT 0, 10
和 LIMIT 0, 50
的后果中,前10条数据不统一。
有 ORDER BY
子句,测试期间没有写操作,不同的分页容量,按以往教训前10条数据应该统一。那么问题可能是 create_time
的值造成的。
查问所有的 create_time
发现,所有的值全副一样。因为是测试环境,测试同学批量导入数据,所以 create_time
值都一样。
起因
如果没有 ORDER BY
子句,MySQL 不保障以任何特定程序返回。咱们可能会察看到相似默认排序的可反复后果,但 MySQL 没有对此做出保障,所以这是不牢靠的。
当 ORDER BY
子句用于排序的值全副雷同时,会造成和没有 ORDER BY
子句一样的后果。
解决方案
SELECT
*
FROM t_user
WHERE age > 20
ORDER BY create_time DESC, no ASC
limit 0, 10;
减少排序字段,防止无奈排序字段值全副雷同。最好应用有惟一束缚的字段作为排序根据。
发表回复