mysql 分頁 重複 Mysql分頁重複問題

2021-10-17 16:50:26 字數 1878 閱讀 1778

因為這個bug,同事差點被祭天​mp.weixin.qq.com

前言前些天同事告訴我遇到乙個的bug.

mysql分頁時每頁的資料中有重複的資料.

我一聽驚呆了,以前怎麼都沒有遇見這種事情.

案件重演

用於涉及到業務表,不方便截圖.就用簡單的模擬資料表來進行測試吧!

建立學生表

create table `student` (

`student_id` int(11) not null auto_increment comment '學生id',

`name` varchar(20) not null comment '姓名',

`score` int(4) default null comment '成績',

primary key (`student_id`)

) engine=innodb auto_increment=146 default charset=utf8mb4 comment='學生表';

插入20條資料

insert into `student`

values

(1, 'king1', 97),

(2, 'king2', 96),

(3, 'king3', 96),

(4, 'king4', 96),

(5, 'king5', 96),

(6, 'king6', 96),

(7, 'king7', 96),

(8, 'king8', 96),

(9, 'king9', 96),

(10, 'king10', 96),

(11, 'king11', 96),

(12, 'king12', 96),

(13, 'king13', 96),

(14, 'king14', 96),

(15, 'king15', 96),

(16, 'king16', 96),

(17, 'king17', 96),

(18, 'king18', 96),

(19, 'king19', 96),

(20, 'king20', 96);

按照分數對學生進行倒敘排列, 然後每頁查詢10條資料.

第一頁資料

第二頁資料

我們可以發現資料總共是有20條的.但是分頁查詢時,

第一頁和第二頁中的資料竟然大量重複了.

測到這裡我感覺產品和測試已經在提刀來的路上了!

問題分析mysql 版本5.5以上

排序欄位中的值大量重複

查詢時使用了排序和limit n,m語句

排序字段不是索引字段

下面我們就對上面的幾點來進行仔細的說明.

首先是因為mysql5.5之後加入了排序優化filesort.

mysql官網上對filesort的說明,感興趣的可以去搜一搜

網上找到的一位大佬對filesort的解釋, 總結說就是因為filesort採用的是不穩定的快速排序和堆排序,所以才會出現排序不穩定的現象

其次是因為我們的資料的排序字段存在大量的重複,導致問題加速暴露.

解決方案:

1. 可以考慮在排序欄位上加上索引,讓排序優先走索引,這樣就可以避免filesort排序了

2. 不採用上面方案的情況下,可以考慮假如額外字段進行排序,例如加入主鍵排序,這樣就不會出現排序重複的問題了!

結束以上就是我對這次問題的乙個完整分析.

總的來說還是因為自己很菜,沒有對自己使用的技術進行深入的學習和研究.

菜沒有錯,菜還不學習就是你的錯了!

也希望看到的小夥伴能和我一樣對學習抱有敬畏之心,知其然還要知其所以然!

mysql分頁概念 MySQL 分頁

分頁的基本原理 mysql explain select from message order by id desc limit 10000,20 1.row id 1 select type table message type index possible keys null key prima...

mysql分頁er 構建高效的MySQL分頁

mysql分頁的主要目的就是提公升效率,今天我們將簡單介紹如何構建高效mysql分頁。首先看一下分頁的基本原理 limit 10000,20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裡,如果是limit 100000,100,需要掃瞄100100行,在乙個...

mysql巢狀分頁 MySQL分頁優化

最近,幫同事重寫了乙個mysql sql語句,該sql語句涉及兩張表,其中一張表是字典表 需返回乙個字段 另一張表是業務表 本身就有150個字段,需全部返回 當然,欄位的個數是否合理在這裡不予評價。平時,返回的資料大概5w左右,系統尚能收到資料。但12月31日那天,資料量大概20w,導致sql執行時...