某天写了一段CRUD,提测给QA,后来想起来忘记按规则排序了,而后修改了代码提交,这个时候QA扔给我一条狗,不,是一个BUG。mybatis
心里一片忧伤,CRUD也有BUG啊,怎么办怎么办,赶忙看看去。测试
BUG描述:分页查询出来的数据有重复和遗漏。这个地方用一个测试表来描述吧。spa
CREATE TABLE `product_info` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `partner_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '供应商ID', `poi_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '门店ID', `product_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品ID', `quantity` decimal(18,6) NOT NULL DEFAULT '0.000000' COMMENT '数量', `created_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '建立时间', `modify_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_partner_poi_product` (`partner_id`,`poi_id`,`product_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='商品表'
数据表product_info中共有8条数据。3d
分页查询第一页:code
分页查询第二页:blog
结论:从图上咱们能够看到 id in(10,40)的数据出现了2次,id in(7,8)的数据没有被查出来。数据确实出现了重复和遗漏。我以前对于mybatis的理解是它会默认按照ID进行排序的,产生了怀疑。排序
第一页看起来是排序是乱的,其实并非,这个顺序是我写入数据的顺序(10,2,3,40,5,63,7,8 故意把ID弄乱了)。第二页看起来是按照id进行排序的。ci
也就是说两次查询感受用了不同的排序方式?其实不是的。真是状况是,它用了堆排序。it
那么不是默认按照ID排序的吗?其实在非limit的状况下,默认真的是按照ID排序的。不信,你看!class
那么面对这种状况要怎么解决分页查询的遗漏和重复呢?--增长排序字段
但是你看,加了排序字段后仍是漏了一条 id in (3)的数据。这又是为何呢?
咱们先看看这几个数据有什么问题呢,能够看到这个排序字段对应的值都是同样的。我怀疑它排序的时候,相同值的排列方式也是堆排序,没有求证,哪位知道的小哥哥小姐姐求指正。
因此第二页limit的时候这几天记录排序不同,可是从第6条开始取值,就漏掉了3,重复了10。
那么这到底要怎么办?--仍是那句话增长排序字段!
增长一个ID字段进行排序,这样就能够把BUG关闭了,否则真的要改行了。