前言
都知道mysql分页使用limit这个关键字来进行的,但今天使用这个关键之进行分页点时候出现了点问题,有些记录没有查到,有些记录在上一页出现之后,翻下一页又出现了。
问题分析
单独使用limit这个关键字是没有问题的,加上order by 这个关键字之后排序就会出现上述问题,猜想order by 这个关键字与limit会相互影响。
问题重现
先准备需要查询的数据
分别执行sql select from limit_test order by score limit 5,select from limit_test order by score limit 5,10
得到结果
结果发现id为8的这条记录出现了2次而id为6的记录没有出现,重现了该问题。
解决问题
小弟束手无策,这个时候只有请求google大神了,最后在mysql官网找到了这个问题的原因 https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html
原因大概是order by 和limit 组合使用的时候,mysql 会将不会整体排序,而是到了需要查的数据量(limit 的值)的时候,就不会进行排序了,而order by 字段相同值记录的顺序是不确定的,所以导致了上面的问题
解决办法
在order by子句中包含附加列,使顺序具有确定性。比如加上唯一的主键id。 例如:
select * from limit_test order by score,id limit 5
总结
用了mysql 这么久,以为对它已经很熟悉了,结果还是太年轻,学习之路,任重道远啊!!