记一次mysql分页问题

前言

都知道mysql分页使用limit这个关键字来进行的,但今天使用这个关键之进行分页点时候出现了点问题,有些记录没有查到,有些记录在上一页出现之后,翻下一页又出现了。

问题分析

单独使用limit这个关键字是没有问题的,加上order by 这个关键字之后排序就会出现上述问题,猜想order by 这个关键字与limit会相互影响。

问题重现

先准备需要查询的数据

0A7F1212-2D6D-4D5D-9AAA-72CE1865C789

分别执行sql select from limit_test order by score limit 5,select from limit_test order by score limit 5,10

得到结果

7E19721F-DF99-4568-B5B3-A18EDBA6E5E1

5C2AF397-2B26-4AB7-B7CA-6F8E64131F9B

结果发现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 这么久,以为对它已经很熟悉了,结果还是太年轻,学习之路,任重道远啊!!