mysql order by 无索引字段 limit 分页数据重复

问题

 在不select *  的 前提下 ,用

SELECT id,created_at FROM medicinal_materials_info
 ORDER BY created_at DESC LIMIT 0,10

SELECT id,created_at FROM medicinal_materials_info
 ORDER BY created_at DESC LIMIT 10,10

进行两次sql查询,得到的结果可能出现相同数据.

原因

在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority queue。

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可

这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。

之所以MySQL 5.6之后出现了第二页数据重复的问题,是因为 priority queue 使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法

也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。

MySQL 5.5 没有这个优化,所以也就不会出现这个问题。

也就是说,MySQL 5.5是不存在本文提到的问题的,5.6版本之后才出现了这种情况

解决办法

1. 全量查询 用select * 代替

2. order by 中增加索引项的排序

3. 排序项上加上索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQLORDER BY语句用于对查询结果进行排序。当我们在分页查询中使用ORDER BY语句时,可能会影响查询性能,原因如下: 1. 排序操作需要消耗额外的计算资源。ORDER BY语句会对查询结果进行排序,这需要对每条记录进行比较和排序操作,消耗CPU和内存资源。 2. 排序操作可能需要使用临时表。如果查询结果集很大,MySQL可能会使用临时表来存储中间结果,然后在临时表上进行排序操作。这会增加磁盘IO操作和存储开销。 3. 排序字段索引可能无效。如果排序的字段没有相应的索引MySQL将无法高效地进行排序操作,而是会执行全表扫描来排序结果。全表扫描会导致查询性能下降。 为了优化分页查询中的排序操作,可以考虑以下方法: 1. 使用索引覆盖查询。如果排序字段有相应的索引,并且查询的字段只包含索引字段MySQL可以直接使用索引进行排序,避免全表扫描和临时表的使用。 2. 限制查询结果集大小。如果只需要获取前几条记录,可以使用LIMIT子句限制结果集的大小,减少排序操作的开销。 3. 避免在分页查询中频繁改变排序字段。如果每次分页查询都使用不同的排序字段MySQL无法充分利用缓存和索引,导致性能下降。最好在分页查询中保持相同的排序字段。 总而言之,分页查询中使用ORDER BY语句可能会影响性能,但可以通过使用索引、限制结果集大小和保持相同的排序字段等方法进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值