mysql5.6+分頁時使用 limit+order by 會出現數據重復問題

mysql5.6+分頁時使用 limit+order by 會出現數據重復問題

問題描述

在MySQL中我們通常會采用limit來進行翻頁查詢,比如limit(0,10)表示列出第一頁的10條數據,limit(10,10)表示列出第二頁。但是,當limit遇到order by的時候,可能會出現翻到第二頁的時候,竟然又出現了第一頁的記錄。

問題本源

在MySQL 5.6的版本上,優化器在遇到order by limit語句的時候,做了一個優化,即 使用了priority queue。

使用 priority queue 的目的,就是在不能使用索引有序性的時候,如果要排序,并且使用了limit n,那么只需要在排序的過程中,保留n條記錄即可,這樣雖然不能解決所有記錄都需要排序的開銷,但是只需要 sort buffer 少量的內存就可以完成排序。

之所以MySQL 5.6出現了第二頁數據重復的問題,是因為 priority queue 使用了堆排序的排序方法,而堆排序是一個不穩定的排序方法,也就是相同的值可能排序出來的結果和讀出來的數據順序不一致。

問題復現

這里創建了一個 glon 表,字段有自增 id, 姓名 name, 年齡 age, 及用戶注冊時間 create_time。這個問題較難復現,要不是碰上了,還不知道居然有這種莫名的問題。

1.根據用戶注冊時間 create_time 來排序:

root@localhost [glon_ho]>select * from glon ORDER BY create_time limit 0, 4;
+----+--------------+---------------------+------+
| id | name         | create_time         | age  |
+----+--------------+---------------------+------+
|  1 | Eason Chan   | 2017-05-02 08:10:10 |   19 |
|  8 | 劉三姐       | 2017-05-02 14:00:00 |   19 |
|  6 | Andy Lau     | 2017-05-02 14:00:00 |   50 |
|  4 | Jacky Cheung | 2017-05-02 14:00:00 |   22 |
+----+--------------+---------------------+------+
4 rows in set (0.00 sec)root@localhost [glon_ho]>select * from glon ORDER BY create_time limit 4, 4;
+----+-----------+---------------------+------+
| id | name      | create_time         | age  |
+----+-----------+---------------------+------+
|  7 | 至尊寶    | 2017-05-02 14:00:00 |   20 |
|  8 | 劉三姐    | 2017-05-02 14:00:00 |   19 |
|  2 | Glon Ho   | 2017-05-03 12:10:10 |   18 |
|  3 | 趙敏      | 2017-05-03 14:10:10 |   17 |
+----+-----------+---------------------+------+
4 rows in set (0.00 sec)

可以看到兩次查詢結果中都出現了 id 為 8 的劉三姐,從上面初始化數據來看,總共有 8 條數據,現在不但分頁出現重復數據,還丟了一條!

問題確實重現了,不過先不急,我們再來試多幾組其他的排序方式。

2.create_time 和 age 組合排序:

root@localhost [glon_ho]>select * from glon ORDER BY create_time,age limit 0, 4;
+----+------------+---------------------+------+
| id | name       | create_time         | age  |
+----+------------+---------------------+------+
|  1 | Eason Chan | 2017-05-02 08:10:10 |   19 |
|  5 | 周芷若     | 2017-05-02 14:00:00 |   16 |
|  8 | 劉三姐     | 2017-05-02 14:00:00 |   19 |
|  7 | 至尊寶     | 2017-05-02 14:00:00 |   20 |
+----+------------+---------------------+------+
4 rows in set (0.00 sec)root@localhost [glon_ho]>select * from glon ORDER BY create_time,age limit 4, 4;
+----+--------------+---------------------+------+
| id | name         | create_time         | age  |
+----+--------------+---------------------+------+
|  4 | Jacky Cheung | 2017-05-02 14:00:00 |   22 |
|  6 | Andy Lau     | 2017-05-02 14:00:00 |   50 |
|  2 | Glon Ho      | 2017-05-03 12:10:10 |   18 |
|  3 | 趙敏         | 2017-05-03 14:10:10 |   17 |
+----+--------------+---------------------+------+
4 rows in set (0.00 sec)

3.create_time 和 id 組合排序:

root@localhost [glon_ho]>select * from glon ORDER BY create_time,id limit 0, 4;
+----+--------------+---------------------+------+
| id | name         | create_time         | age  |
+----+--------------+---------------------+------+
|  1 | Eason Chan   | 2017-05-02 08:10:10 |   19 |
|  4 | Jacky Cheung | 2017-05-02 14:00:00 |   22 |
|  5 | 周芷若       | 2017-05-02 14:00:00 |   16 |
|  6 | Andy Lau     | 2017-05-02 14:00:00 |   50 |
+----+--------------+---------------------+------+
4 rows in set (0.00 sec)root@localhost [glon_ho]>select * from glon ORDER BY create_time,id limit 4, 4;
+----+-----------+---------------------+------+
| id | name      | create_time         | age  |
+----+-----------+---------------------+------+
|  7 | 至尊寶    | 2017-05-02 14:00:00 |   20 |
|  8 | 劉三姐    | 2017-05-02 14:00:00 |   19 |
|  2 | Glon Ho   | 2017-05-03 12:10:10 |   18 |
|  3 | 趙敏      | 2017-05-03 14:10:10 |   17 |
+----+-----------+---------------------+------+
4 rows in set (0.00 sec)

4.主鍵 id 排序:

root@localhost [glon_ho]>select * from glon ORDER BY id limit 0, 4;
+----+--------------+---------------------+------+
| id | name         | create_time         | age  |
+----+--------------+---------------------+------+
|  1 | Eason Chan   | 2017-05-02 08:10:10 |   19 |
|  2 | Glon Ho      | 2017-05-03 12:10:10 |   18 |
|  3 | 趙敏         | 2017-05-03 14:10:10 |   17 |
|  4 | Jacky Cheung | 2017-05-02 14:00:00 |   22 |
+----+--------------+---------------------+------+
4 rows in set (0.00 sec)root@localhost [glon_ho]>select * from glon ORDER BY id limit 4, 4;
+----+-----------+---------------------+------+
| id | name      | create_time         | age  |
+----+-----------+---------------------+------+
|  5 | 周芷若    | 2017-05-02 14:00:00 |   16 |
|  6 | Andy Lau  | 2017-05-02 14:00:00 |   50 |
|  7 | 至尊寶    | 2017-05-02 14:00:00 |   20 |
|  8 | 劉三姐    | 2017-05-02 14:00:00 |   19 |
+----+-----------+---------------------+------+
4 rows in set (0.00 sec)
總結

MySQL 使用 limit 進行分頁時,可能會出現重復數據,通過加入 order by 子句可以解決,但是需要注意的是,如果排序字段有相同值的情況下,由于排序字段數據重復,可能會導致每次查詢排序后結果順序不同,分頁還是會出現重復數據,這時可以加入第二個排序字段,提高排序的唯一性,最好保證排序的字段在表中的值是唯一的,這樣就可以少寫一個排序字段,增加查詢效率,因為 order by 后面有多個排序字段時,無法用到索引。

當分頁重復發生了,最簡單的方法就是在排序字段(如 create time)上加索引,如果還是無法解決,在 order by 上明示 primary key(即在order by中增加id主鍵字段的排序),這個問題就能非常圓滿的解決了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920954.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【XR技術概念科普】VST(視頻透視)vs OST(光學透視):解碼MR頭顯的兩種核心技術路徑

混合現實(MR)頭顯作為連接虛擬與現實世界的橋梁,其核心技術路徑主要分為視頻透視(VST)和光學透視(OST)兩種。本文將深入探討這兩種技術的原理、優缺點、代表性產品、應用場景及未來發展趨勢,為讀者全面解析MR頭顯的技術選擇。一、VST技術詳解1.1 VST技術…

VR智慧樓宇技術:打造智能辦公空間的卓越方案?

在華銳視點打造的極具創新性的VR智慧樓宇的智能辦公空間里,員工的工作模式迎來了前所未有的、徹頭徹尾的顛覆性變革。憑借華銳視點自主研發的先進VR設備,哪怕員工遠在千里之外的不同城市,甚至身處不同國家,也能如同真切地置身于同…

C++ 面試考點 類成員函數的調用時機

構造函數和析構函數的調用時機 1. 對于全局定義的對象,每當程序開始運行,在主函數 main 接受程序控制權之前,就調 用構造函數創建全局對象,整個程序結束時,自動調用全局對象的析構函數。 2. 對于局部定義的對象&#…

59.螺旋矩陣II

59.螺旋矩陣II 螺旋矩陣沒有什么算法,就是一道單純模擬轉圈的一道題目,因為轉圈的過程需要處理的邊界條件很多,所以有難度 那只能從第二個節點開始處理;從第二個節點開始處理,把最后一個節點也處理了(第二…

MS SQL(Microsoft SQL Server)面試常考的知識點

MS SQL是Microsoft SQL Server的簡稱,是由微軟公司開發的一款關系型數據庫管理系統(RDBMS,Relational DataBase Management System)。它支持在Windows和Linux上運行,廣泛應用于企業級數據庫市場,適用于大型企業網站和應…

百勝軟件獲邀出席第七屆中國智慧零售大會,智能中臺助力品牌零售數智變革

8月28日,由深圳市智慧零售協會主辦的第七屆中國智慧零售大會在深圳福田希爾頓酒店成功召開。本屆大會以“聚勢AI共啟智慧零售新生態”為主題,匯聚了來自北京大學、騰訊云、百果園、舍得酒業、美宜佳等眾多知名企業與機構的專家代表,共同探討A…

QEMU使用Qemu-Guest-Agent傳輸文件、執行指令等

簡介 之前介紹過qemu傳輸文件,使用的掛載 / samba方式 :Qemu和宿主機不使用外網進行文件傳輸。 這是一種方式,這里還有另一種方式:使用Qemu-Guest-Agent,后面簡稱qga。 官網介紹:https://www.qemu.org/docs/master/interop/qemu-ga.html 安裝 這里有一篇參考文章,會…

HTML 核心標簽全解析:從文本排版到媒體嵌入

在網頁開發中,HTML(超文本標記語言)是構建頁面結構的基石。掌握各類核心標簽的用法,是實現頁面內容有序呈現、提升用戶體驗的關鍵。本文將系統講解 HTML 中最常用的幾類標簽 —— 段落標簽、文本格式標簽、列表標簽、表格&#xf…

[后端快速搭建]基于 Django+DeepSeek API 快速搭建智能問答后端

在 AI 應用開發中,將大模型 API 與 Web 框架結合是常見需求。本文將詳細記錄如何使用 Django 搭建后端服務,并集成 DeepSeek API 實現智能問答功能,包含環境配置、路由設計、API 調用及異常處理的完整流程,適合需要快速搭建 AI 問…

R 語言 + 卒中 Meta 分析

R 語言 卒中 Meta 分析:4 類核心場景完整代碼(含藥物對比 / 劑量風險) 卒中(缺血性 / 出血性)的臨床決策高度依賴循證證據,而 Meta 分析是整合多中心研究結果的核心工具。本文以卒中臨床研究為核心&#x…

Goframe 框架下HTTP反向代理并支持MCP所需的SSE協議的實現

一、需求背景 Go 語言開發 MCP 服務,并在 Goframe 框架下實現 Http 反向代理,代理該 MCP 服務。 二、效果演示 三、Goframe框架簡介 GoFrame 是一款模塊化、低耦合設計、高性能的Go 語言開發框架。包含了常用的基礎組件和開發工具,既可以作…

Git將多筆patch合并成一筆

一、方法1、在你的代碼中把這多筆patch都打上2、git reset到origin那一筆(默認模式,不帶soft或者hard)3、再add和commit,push二、種模式對比模式命令示例影響范圍適用場景--softgit reset --soft HEAD~1僅移動 HEAD,保留修改在暫存區修改提交…

【SpringBoot】Dubbo、Zookeeper

文章目錄前提知識概要分布式系統單體架構垂直應用架構分布式架構流式架構RPCDubbo概念Dubbo環境搭建Zookeeper測試 ZookeeperWindow環境下使用Dubbo-admin版本匹配不對服務注冊實戰內容總結導入相關依賴選擇 Zookeeper 版本配置并啟用 Zookeeper創建服務接口和實現(DubboServic…

【不說廢話】pytorch張量相對于numpy數組的優勢

核心關系 我們首先需要了解:PyTorch 張量在設計上深受 NumPy 數組的影響,它們共享許多相似的 API 和概念。實際上,PyTorch 張量可以看作是支持 GPU 加速和自動求導功能的 NumPy 數組。PyTorch 張量的主要優勢 1. GPU 加速支持(最重…

拼團小程序源碼分享拼團余額提現小程序定制教程開發源碼二開

功能詳細說明(一)首頁功能進入首頁,可看到以下核心功能:1、優惠券,錢包,簽到,拼團,分銷等各種功能入口2、推薦的商品和活動3、下方功能欄的各種功能(二)客服功…

pikachu之XSS

XSS(跨站腳本)概述Cross-Site Scripting 簡稱為“CSS”,為避免與前端疊成樣式表的縮寫"CSS"沖突,故又稱XSS。一般XSS可以分為如下幾種常見類型:1.反射性XSS;2.存儲型XSS;3.DOM型XSS;XSS漏洞一直被評估為web漏…

【Element Plus `el-select` 下拉菜單響應式定位問題深度解析】

Element Plus el-select 下拉菜單響應式定位問題深度解析 本文檔旨在深入剖析一個在響應式布局中常見的 UI 問題:如何確保一個靠近屏幕邊緣的 el-select 組件的下拉菜單,在任何屏幕尺寸下都能以預期的、優雅的方式顯示。 1. 需求背景 在一個大屏數據展示…

Qt 項目文件(.pro)中添加 UI 文件相關命令

在 Qt 的 .pro 項目文件中,處理 UI 文件(.ui 文件)通常需要以下配置: 基本 UI 文件配置 自動包含 UI 文件: qmake FORMS yourfile.ui \anotherfile.ui Qt 構建系統會自動使用 uic(用戶界面編譯器&#xff…

展會回顧 | 聚焦醫療前沿 , 禮達先導在廣州醫博會展示類器官自動化培養技術

8月22-24日,廣州醫博會在廣交會展館B區圓滿落幕。此次盛會匯聚了來自全球醫療健康領域的頂尖專家學者、企業代表與合作伙伴。展會內容涵蓋基礎研發、臨床應用、前沿技術、產業轉化、醫療服務及金融支持,全景呈現醫療健康產業的創新生態,成為連…

華為eNSP防火墻綜合網絡結構訓練.docx

1.IP及VLAN規劃情況 設備 接口 IP vlan 備注 AR1 g0/0/0 1.1.1.2/28 PPPOE g0/0/1 3.3.3.1/30 g0/0/2 114.114.114.254/24 AR2 g0/0/0 2.2.2.2/28 DHCP g0/0/1 3.3.3.2/30 g0/0/2 100.100.100.254/24 FW1 g1/0/0 10.0.0.1/30 tr…