MySQL 使用 order by limit 分页排序会导致数据丢失和重复
MySQL 使用 order by limit 分页排序会导致数据丢失和重复!
order by导致分页数据错误
在MySQL中,使用ORDER BY进行排序并结合LIMIT进行分页时,可能会遇到数据丢失和重复的问题。问题源于当ORDER BY字段无索引且使用LIMIT时,MySQL采用堆排序,导致排序不稳定。解决方案包括添加有索引的字段如主键进行排序,或者避免使用MySQL 5.6及以上版本的特定优化。理解这个问题有助于避免项目中潜在的数据错误。
order by 后面的字段必须是唯一的,否则在分页查询的时候,结果可能是错误的,例如第一页的最后一条数据,可能查第二页的第一条也是该条数据,这个mysql排序导致的
示例:查询订单交易记录按交易时间排序(交易时间非唯一,即多笔订单存在相同交易时间的情况)
//查询前十条订单
select * from order_info order by trans_time desc limit 0,10;
//查询10-20条订单
select * from order_info order by trans_time desc limit 10,10;
解决办法:在order by 的条件中加上主键,使之唯一(这里id是主键)
select * from order_info order by trans_time desc,id limit 0,10;
order by 字段 desc,id
最尾的地方加上id