今天业务碰到一个线上问题,业务order by字段shopcode,用limit m,n做分页,希望按照shopcode排序获取所有的数据,但是遍历完一遍,发现有的数据没有获取到。
挺奇怪的,于是做了个实验,复现了情景。
|
|
我们发现 limit 0,2和limit 8,2的结果是一样的,看来原先对order by的理解有问题, 原来以为是先对shopcode整体排好序,再取对应分页的数据,查了下官方文档:
|
|
上面官方文档里面有提到如果你将Limit row_count与order by混用,mysql会找到排序的row_count行后立马返回,而不是排序整个查询结果再返回。
为什么分页会不准呢?
|
|
如果order by的字段有多个行都有相同的值,mysql是会随机的顺序返回查询结果的,具体依赖对应的执行计划。
那这种情况应该怎么解决呢?
|
|
如果想在Limit存在或不存在的情况下,都保证排序结果相同,可以额外加一个排序条件。例如id字段是唯一的,可以考虑在排序字段中额外加个id排序去确保顺序稳定。
如果SQL改成 select * from shop order by shopcode,id limit M,N。遍历去取数据妥妥没问题了。
官方文档:https://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html