假如我有一张表 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