关于mysql使用order排序后分页数据重复(排序不稳定)问题

背景:

今天排查一个bug,列表数据总共有21一条记录,记录A出现在第一页数据中,第三页(每页10条,即最后一条记录)再次出现了A记录!

场景:

  select * from tk_category own  WHERE own.parent_id = '0'
AND own.site_id = '605703673376407552' ORDER BY own.sort desc  LIMIT 0,10

关于mysql使用order排序后分页数据重复(排序不稳定)问题_第1张图片如图,查询第一页数据!

    select * from tk_category own  WHERE own.parent_id = '0'
AND own.site_id = '605703673376407552' ORDER BY own.sort desc  LIMIT 20,10

关于mysql使用order排序后分页数据重复(排序不稳定)问题_第2张图片如图,查询第三页数据!

分析:

由于分页时,采用sort字段排序,造成了分页查询时排序的不稳定,从而出现分页查询数据重复的现象。纠结了半天,感觉以前使用了很多次排序分页,也没遇到过此问题。然后去研究了一下。大部分文章说,由于mysql针对大量相同字段值相同的列排序,优化器会采取排序算法优化,从而造成结果集不稳定。只有把排序字段添加为索引,就可以避免此问题。

关于mysql使用order排序后分页数据重复(排序不稳定)问题_第3张图片 此处sort字段已经是索引

总结:

sql查询语句中,如果排序字段不是高度散列的。mysql优化器把采用自己排序算法进行排序,从而造成结果集不稳定。如果遇到这样的场景,只需要再加一个高度散列的排序字段作为第二排序,即可解决此问题。

PS:

此问题此前还真没遇见过,自己花了点时间排查了下,顺便动动手指头记录一下。第一天入住思否,了解此问题的大牛勿踩哈。感谢!

你可能感兴趣的:(mysql)