亚洲步兵一区二区三区-日韩精品伦理在线一区-亚洲色诱视频免费观看-久久人妻视频免费观看

廣州總部電話:020-85564311
廣州總部電話:020-85564311
20年
互聯網應用服務商
請輸入搜索關鍵詞
知識庫 知識庫

優網知識庫

探索行業前沿,共享知識寶庫

MySQL分頁的“靈異事件”:為什么我的排序總是不對勁?

發布日期:2025-09-01 15:35:15 瀏覽次數: 829 來源:JAVA
推薦語
MySQL分頁排序的坑你踩過嗎?揭秘ORDER BY和LIMIT組合的隱藏陷阱。

核心內容:
1. 電商熱銷榜分頁出現的重復數據問題
2. 用戶積分排行榜分頁結果與總排序不一致的詭異現象
3. 深入分析MySQL排序機制與解決方案
小優 網站建設顧問
專業來源于二十年的積累,用心讓我們做到更好!

我遇到了什么问题?🤯

故事要从几个不同的项目场景说起,但它们都指向了同一个诡异的现象。

场景一:热销商品排行榜

第一个项目是个电商平台,产品经理跑过来跟我说:“咱们得在首页搞个‘爆款热销榜’,展示销量最高的 10 个商品,还要能分页,让用户看看第 11-20 名,以此类推。”

“小意思!” 我心想,这不就是一条 SQL 的事儿嘛。于是我啪啪啪敲下代码:

-- 查询第一页的热销商品 (Top 1-10)
SELECT product_name, sales_volume
FROM products
ORDER BY sales_volume DESC
LIMIT 010;

本地测试,完美!数据按销量从高到低排得整整齐齐。接着我又测了第二页:

-- 查询第二页的热销商品 (Top 11-20)
SELECT product_name, sales_volume
FROM products
ORDER BY sales_volume DESC
LIMIT 1010;

也没问题!部署上线!然后……诡异的事情发生了。客服开始收到用户反馈:“我刚在第一页看到的那个‘超级无敌螺蛳粉’,怎么翻到第二页又看到了?”

我当时的第一反应:前端缓存问题?还是后端应用缓存抽风了?查了一圈,都不是。我直接在生产数据库里执行这两条 SQL,惊奇地发现,真的有重复数据!更奇怪的是,当我不加 LIMIT 查看所有商品排序时,那个螺蛳粉明明只出现了一次。

这不科学啊!难道是 MySQL 中邪了?🤔

场景二:用户积分排行榜

无独有偶,在另一个社交 App 项目里,我们要做一个用户积分排行榜。需求同样简单:按积分 points 倒序排列,分页展示。

SQL 语句也大同小异:

-- 查询积分榜第 1-6 名
SELECT username, points
FROM users
ORDER BY points DESC
LIMIT 06;

上线后,测试同学提了个 bug:他发现当他不分页,直接 ORDER BY points DESC 查看总榜单时,前 6 名的用户是 A, B, C, D, E, F。但是用上面的分页接口查出来的结果却是 A, B, C, D, G, H。

我人都麻了 😵。为什么加了个 LIMIT,排序结果就跟总排序不一致了?这俩用户 G 和 H 的积分跟 E 和 F 明明是一样的啊!

这两个场景让我陷入了沉思,同样的问题反复出现,绝对不是偶然。问题核心就是:

在排序字段有重复值的情况下,ORDER BY ... LIMIT ... 的分页查询结果,与不带 LIMIT 的总排序结果不一致,导致分页数据出现重复或错乱。

我是如何解决的 💡

在经历了初步的自我怀疑(“是不是我 SQL 写错了?”)和甩锅(“是不是数据库有 Bug?”)之后,我决定冷静下来,直面问题的根源。我开始怀疑,是不是 ORDER BY 和 LIMIT 一起用的时候,有什么我不知道的“潜规则”?

于是,我请出了我的终极武器——官方文档。功夫不负有心人,在 MySQL 的文档里,我找到了下面这段话,简直是醍醐灌顶!

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

One factor that affects the execution plan is LIMIT, so an ORDER BY query with and without LIMIT may return rows in different orders.

我来给大家翻译翻译,这其实就是 MySQL 在跟我们说:

“嗨,哥们儿!如果你让我按照一个字段排序,结果有好几行的值都一样(比如好几个用户积分都是 1000),那我可就犯懒了啊。对于这些值相同的行,我怎么排顺序可就不一定了,全看我当时的心情(执行计划)。你加个 LIMIT,我的心情(执行计划)可能就变了,所以两次排序结果可能不一样哦!”

这就是那个恍然大悟的瞬间! Aha! ✨

原来问题不出在 LIMIT,也不出在 ORDER BY,而是出在当排序条件不足以让每一行的位置都变得唯一和确定时,MySQL 为了优化查询,可能会选择不同的执行路径,从而导致了这种“不稳定”的排序。

这就好比老师让学生按身高排队,结果好几个同学一样高,老师就随便把他们排在一起了。下次再排队,这几个一样高的同学谁先谁后可能就变了。

解决方案:给它一个“第二志愿”

既然问题的原因是排序不够“稳定”,那解决方法就很简单了:给它一个能确保顺序唯一的第二排序条件!

什么字段是绝对唯一的?没错,就是我们的老朋友——主键 id!

于是,我把之前的 SQL 语句都改成了这样:

场景一:热销商品排行榜(修复版) ✅

-- 错误的,不稳定的排序 ❌
-- SELECT product_name, sales_volume FROM products ORDER BY sales_volume DESC LIMIT 0, 10;

-- 正确的,稳定的排序 ✅
SELECT product_name, sales_volume
FROM products
-- 先按销量排序,如果销量相同,再按 id 从小到大排,保证顺序唯一
ORDER BY sales_volume DESC, id ASC
LIMIT 010;

场景二:用户积分排行榜(修复版) ✅

-- 错误的,不稳定的排序 ❌
-- SELECT username, points FROM users ORDER BY points DESC LIMIT 0, 6;

-- 正确的,稳定的排序 ✅
SELECT username, points
FROM users
-- 先按积分排序,如果积分相同,再按用户注册时间(id通常自增)排序
ORDER BY points DESC, id ASC
LIMIT 06;

加上 id ASC 作为第二个排序条件后,就等于告诉了 MySQL:“先按我们的主要规则(销量、积分)排,如果遇到好几个值一样的,别偷懒,再按照 id 的顺序给我排一次!”

因为 id 是主键,永远不会重复,所以这样一来,无论加不加 LIMIT,无论查第几页,整个排序结果集都是绝对稳定和可预测的。那个“灵异事件”自然就消失得无影无踪了。

总结一下 📝

这个坑虽然不大,但非常具有迷惑性,尤其是在测试数据量小、排序值都唯一的情况下很难发现。所以,请务必记住这个黄金法则:

任何时候,当你需要对可能存在重复值的列进行 ORDER BY 分页查询时,一定要在后面追加一个唯一键(如 id)作为第二排序条件,来保证排序的稳定性。

这一个小小的改动,就能避免掉线上的“灵异事件”,省下你一下午挠头抓狂的调试时间。希望我的这次经历能帮到你!

👍🎉

 

源:juejin.cn/post/7527863756283854899
END



優網科技,優秀企業首選的互聯網供應服務商

優網科技秉承"專業團隊、品質服務" 的經營理念,誠信務實的服務了近萬家客戶,成為眾多世界500強、集團和上市公司的長期合作伙伴!

優網科技成立于2001年,擅長網站建設、網站與各類業務系統深度整合,致力于提供完善的企業互聯網解決方案。優網科技提供PC端網站建設(品牌展示型、官方門戶型、營銷商務型、電子商務型、信息門戶型、微信小程序定制開發、移動端應用(手機站APP開發)、微信定制開發(微信官網、微信商城、企業微信)等一系列互聯網應用服務。


我要投稿

姓名

文章鏈接

提交即表示你已閱讀并同意《個人信息保護聲明》

專屬顧問 專屬顧問
掃碼咨詢您的優網專屬顧問!
專屬顧問
馬上咨詢
掃一掃馬上咨詢
掃一掃馬上咨詢

掃一掃馬上咨詢

主站蜘蛛池模板: 中文人妻在线免费视频| 一区二区大香蕉在线视频| 91麻豆国产在线视频| 91人妻人人澡人人爽人| 国产女人专区久久久久久久| 欧美激情笫一欧美精品| 999精品视频在线观看| 精品少妇一区二区三区四区性色av| 少妇性猛交久久久乱大交| 久草婷婷视频在线观看| 中文乱码二区三区视频| 精品国产一二三四五区| 日韩av福利在线播放| 丰满人妻一区二区三区免费视频| 欧美日韩一区二区三区一| 亚洲国产午夜精品理论片无| 一区二区三区四区高清在线播放视频| 熟妇人妻内射一区二区三区| 久久五月婷婷丁香社区| 中文字幕日韩新片免费观看| 国产精品日韩av一区二区| 日本久久黄色劲爆视频| 欧美一级和欧美三级在线观看| 日韩在线欧美中文字幕| 丰满人妻被中出中文字幕日韩| 99久久精品费精品国产一区二区| 国产一区二区三区在线观看第八页| 国产午夜免费在线播放视频| 中文字幕av乱码在线| 国产麻豆精品三级在线| 亚洲国产高清国产精品| 国产精品午夜福利久久久| 欧美一区二区不卡专区| 香蕉视频看美女的小逼逼| 国产激情视频在线观看| 色哟哟亚洲一区二区三区| 日本黄色小网站在线播放| 国产日韩欧美在线观看一区播放视频| 久久夜色精品亚洲国产av| 妖精亚洲av成人精品一区二区| 国产黄色一区二区三区四区|