问答

Mysql:如何处理分页的数据重叠问题?

作者:admin 2021-04-20 我要评论

假如我有一张表 table_a ,有字段: date(varchar) , user_id 以及其他 现在想要分页读取,且指定 date 范围,按照 date 降序排序,譬如 date user_id20210102 1...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

假如我有一张表 table_a,有字段: date(varchar), user_id以及其他
现在想要分页读取,且指定date范围,按照date降序排序,譬如

date        user_id
20210102     1111
20210103     2111
20210104     3111
20210105     1111
20210201     2111
20210202     1111

指定date范围是20210103-20210201之间
要求分页大小是2
则上面数据分为2
分别是

20210201     2111
20210105     1111

20210104     3111
20210103     2111

现在对date建立一个索引,sql语句为

select * from table_a where date < #{d1} and date > #{d2} order by date desc limit 2 offset #{offset}

不够担心这个语句下,limit 2 offset #{offset}#{offset}不同的情况下有数据重叠
我的担心多余吗?

假如会出现重叠
怎么处理?

我想法是建立索引(date,user_id)
sql语句为

select * from table_a where date < #{d1} and date > #{d2} order by date desc, user_id desc limit 2 offset #{offset}

虽然索引(date,user_id)user_id不起作用,但是毕竟索引(date,user_id)是有序的,所以不会出现重叠?

但是这样的问题是 mysql8 以下不支持联合索引 desc
怎么办?

###

没有主键吗, ORDER BY date DESC, id DESC

###

如果你的业务是认为,date,user_id 是算唯一,可以使用 distinct 函数即可

###

MySQL在5.6版本后,order by和limit混用的时候,由于使用了堆排序(不稳定),会出现排序混乱情况。
建议解决方案:在order by 排序字段最后添加唯一ID字段,如:
order by date desc, id

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器