最近order by与limit联用做分页的过程中发现,查询出来的结果与预期的不一致,很明显结果是不对的,先贴出我的mysql的版本
1.我的查询的原理是,按数据更新时间降序,取出最新的每页10条的数据,目前表中时间字段都是NULL,可以看做是多条数据的排序字段的值相同
2.首先取出前十条数据:
3.再取出11-20条数据:
4.最后取出前20条数据:
5.很明显我们可以对比出,前两次的查询结果拼起来并不是第三次查询的结果,原因:
如果order by的字段有多个行都有相同的值(本例中都是NULL可看作相同值),mysql是会随机的顺序返回查询结果的,具体依赖对应的执行计划。也就是说如果排序的列是无序的,那么排序的结果行的顺序也是不确定的。
基于这个我们就基本知道为什么分页会不准了,因为我们排序的字段是updateTime,正好大部分行的值相同,所以在实际执行时返回结果对应的行的顺序是不确定的。
6.解决办法: 可以额外加一个排序条件。例如主键id字段是唯一的,可以考虑在排序字段中额外加个id排序去确保顺序稳定。
7.现在再看是不是结果就没问题了: