记一次mysql分页问题


title: “记一次mysql分页问题”
date: 2019-09-15
tags: [“mysql”]
categories: 后台


前言

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值