这么分页,小心有坑
(资料图)
背景
生产上有个导报表功能,工作了很长一段时间一直都很稳,没出现过什么问题,最近运营同学突然反馈导出来的数据和实际的对不上,经过排查发现导出的数据有重复,也有的没导出来。由于我们提前生成好数据(每天会truncate重新生成),所以导出的逻辑非常简单,不需要关联很多表捞数据,只需要从一张表查即可,这个表的数据量不大,发生问题时7800条左右,查询的sql也非常简单,可以选择条件导出知道时间段的数据,如下:
SELECT * FROM t_report WHERE repayment_time > 1622390400000 AND repayment_time <= 1624032000000 limit 1000,1000为了防止一次性导出太多数据,所以我们做了分页,每次查1000条,并且repayment_time字段上建了索引。经过一顿排查后,发现程序没啥问题,但数据也确实是重复了,也漏了一些...
分析
我们对比了实际数据,确实有问题,有的数据出现两次,有的没出现。如下:
有一条数据在第6页查出,在第8页又被查出。我们再次确认了程序,还是没问题,用arthas观察了分页的入参也都是正确的。那么直接拿sql出来到数据库查询呢?发现真有问题...,确实在第6页和第8页出现。那么可以确定就是sql有问题了,这么简单的sql查数据居然重复了...仔细看数据可以发现,在第6页的时候,查出来的数据是按照repayment_time字段排序,而第8页则是按照id进行排序,排序方式不同分页查出来的数据肯定会不同。
问题已经定位到,就是在分页过程中,mysql偷偷改了排序的规则。我们可以看不同页的执行计划如下,由于每天生成的数据不同,这里我改了页数。
那么同样的sql为什么会使用不同的排序,生成不同的执行计划呢?我们知道mysql在使用索引的时候,是会根据数据的分布进行的,也就是mysql会考虑索引的效果,如果效果好才使用。我们常说性别字段不适合建索引,就是因为这种字段的区分度很低,mysql宁愿全表扫描也不会使用这种索引。使用show index from table可以查看索引信息,cardinality就是字段的区分度,通常该值越大越适合建索引。
我们说到mysql会考虑到数据的分布,虽然我们上面的repayment_time字段是建索引,运营当时的查询条件刚好覆盖了整个表的数据,当翻到第8页时,整个表总共也就8页,就是要查全部数据了,mysql此时会放弃使用索引,进行全表扫描。前面的页使用到索引,默认会根据索引字段进行排序,而后面页没使用索引,默认就是根据id进行排序。不一定是最后一页才生成不同的执行计划,比如我们的表有10w条数据,可能查到95000条数据的时候,排序就变了,也就是说mysql认为几乎要查全部数据,就会改变执行计划。
解决方式也很简单,我们可以显示指定排序方式,这样每次生成的执行计划都是一样的,如上的sql,改为:
SELECT * FROM t_report WHERE repayment_time > 1622390400000 AND repayment_time <= 1624032000000 order by repayment_time,id limit 1000,1000注意加了order by需要考虑file sort问题,排序字段没有使用索引可能会导致性能问题。分页写法开发有时候很容易漏掉order by,这种最好在需求阶段就和产品确认清楚,这样可以在开发和测试阶段就通过数据验证需求,当然开发也要考虑数据分布,比如数据量,有多少重复数据等,以后记得这个坑,避免再次掉入哦。
关键词:
上一篇:465只股短线走稳 站上五日均线
下一篇:最后一页
精心推荐
- 年轻用户愿为宠物消费 宠物家电产品却陷同质化难题
- 明阳科技北交所过会:汽车座椅零部件生产企业 前三季度净利润增长31.56%
- 世界热资讯!常宝股份董秘回复:目前常宝具备100万吨中小口径特种专用管生产能力,在行业中的规模及综合竞争力已在前列
- 环球快资讯丨麦趣尔12月30日快速回调
- 【大美中国】冬日湿地美
- Day 011 概率投资
- 新洋丰(000902):公司独立董事任期届满辞职及增补独立董事
- 每日看点!宏润建设董秘回复:公司实际控制人本次减持公司股份因其自身资金需求
- 微粒贷借款逾期10年多久上征信系统
- 天天速看:东箭科技(300978)12月28日主力资金净卖出107.43万元
- 提升林长履职效能 推进林业增绿增效
- 全球亿万富豪今年身家共蒸发近2万亿美元 马斯克缩水最多
- 焦点日报:京东二轮出行、中国质量认证中心联合认证 电动车头盔行业迎来新标准
- 电力股整体偏强 中国电力(02380)涨12.32%
-
离婚时保单是否能当做共同财产分割,要看购买保险的钱是夫妻共同生活收入,还是婚前个人无形财产的收入。如果是夫妻共同生活收入,应列入夫妻
-
2023年春运购票日历12月24日可以购买1月7日的票,1月7日可以购买1月21日也就是除夕那天的票。2023年1月7日开始,2月15日结束,共计40天。
-
引言李厚霖原来和汪小菲也是朋友,看来朋友也是有群的,往往是穷人与穷人之间成团,富人与富人之间成群,物以类聚,人以群分呀!汪小菲最近由
-
新华社华盛顿12月25日电(记者孙丁)据美国媒体25日报道,几辆大巴车24日晚抵达美国副总统哈里斯位于首都华盛顿市西北部的官邸外,严寒中,大
-
80度水泡茶刚刚合适,既可以保住茶的芳香,又可以保住茶的营养物质,所以说80度的水是非常适合泡茶的温度。泡茶的水温不能太高,冲泡绿茶适宜
X 关闭
X 关闭
产业
-
科伦股份发布2022半年度报告 公...
科伦股份(832093)近日发布2022年半年度报告,报告期内公司实现营业...
-
“张同学”商标被多方抢注 涉及...
“张同学”商标被多方抢注,官方曾点名批评恶意抢注“丁真” ...
-
山东济南“防诈奶奶团”花式反诈...
中新网济南12月15日电 (李明芮)“老有所为 无私奉献 志愿服...
-
广州新增1例境外输入关联无症状...
广州卫健委今日通报,2021年12月15日,在对入境转运专班工作人...
-
西安报告初筛阳性病例转为确诊病例
12月15日10:20,经陕西西安市级专家组会诊,西安市报告新冠病毒...
-
广东东莞新增本土确诊病例2例 ...
(抗击新冠肺炎)广东东莞新增本土确诊病例2例 全市全员核酸检测...
-
中缅边境临沧:民警深夜出击捣毁...
中新网临沧12月15日电 (胡波 邱珺珲)记者15日从云南临沧边境...
-
“土家鼓王”彭承金:致力传承土...
中新网恩施12月15日电 题:“土家鼓王”彭承金:致力传承土家...
-
云南新增境外输入确诊病例3例
(抗击新冠肺炎)云南新增境外输入确诊病例3例 中新网昆明12月...
-
直击南昌一医疗器械公司厂房火灾...
中新网南昌12月15日电 (刘力鑫)经过10余个小时的紧张救援,费...
