mysql limit 資料重複及遺漏

2022-08-11 04:51:07 字數 2485 閱讀 9756

某天寫了一段crud,提測給qa,後來想起來忘記按規則排序了,然後修改了**提交,這個時候qa扔給我一條狗,不,是乙個bug。

內心一片憂傷,crud也有bug啊,怎麼辦怎麼辦,趕緊看看去。

bug描述:分頁查詢出來的資料有重複和遺漏。這個地方用乙個測試表來描述吧。

create

table

`product_info` (

`id`

bigint(20) unsigned not

null auto_increment comment '

自增主鍵',

`partner_id`

int(11) unsigned not

null

default'0

' comment '

**商id',

`poi_id`

int(11) unsigned not

null

default'0

' comment '

門店id',

`product_id`

bigint(20) unsigned not

null

default'0

' comment '

商品id',

`quantity`

decimal(18,6) not

null

default

'0.000000

' comment '數量'

, `created_time`

datetime

notnull

default

'1000-01-01 00:00:00

' comment '

建立時間',

`modify_time`

datetime

notnull

default

'1000-01-01 00:00:00

' comment '

修改時間',

primary

key(`id`),

unique

key`uk_partner_poi_product` (`partner_id`,`poi_id`,`product_id`)

) engine

=innodb auto_increment=

1default charset=utf8mb4 comment=

'商品表

'

資料表product_info中共有8條資料。

分頁查詢第一頁:

分頁查詢第二頁:

結論:從圖上我們可以看到 id in(10,40)的資料出現了2次,id in(7,8)的資料沒有被查出來。資料確實出現了重複和遺漏。我之前對於mybatis的理解是它會預設按照id進行排序的,產生了懷疑。

第一頁看起來是排序是亂的,其實並不是,這個順序是我寫入資料的順序(10,2,3,40,5,63,7,8 故意把id弄亂了)。第二頁看起來是按照id進行排序的。

也就是說兩次查詢感覺用了不一樣的排序方式?其實不是的。真是情況是,它用了堆排序。

那麼不是預設按照id排序的嗎?其實在非limit的情況下,預設真的是按照id排序的。不信,你看!

那麼面對這種情況要怎麼解決分頁查詢的遺漏和重複呢?--增加排序字段

可是你看,加了排序欄位後還是漏了一條 id in (3)的資料。這又是為什麼呢?

我們先看看這幾個資料有什麼問題呢,可以看到這個排序字段對應的值都是一樣的。我懷疑它排序的時候,相同值的排列方式也是堆排序,沒有求證,哪位知道的小哥哥小姐姐求指正。

所以第二頁limit的時候這幾天記錄排序不一樣,但是從第6條開始取值,就漏掉了3,重複了10。

那麼這到底要怎麼辦?--還是那句話增加排序字段!

增加乙個id欄位進行排序,這樣就可以把bug關閉了,不然真的要改行了。

mysql LIMIT 子句用法及原理

使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,已 經為我們提供了這樣乙個功能。limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量...

MySQL limit用法及效能分析

在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料 分頁 這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣乙個功能。具體語法 select from table limit offset,rows rows offset offsetlimit 子句可以被用於強制 select ...

mysq llimit 優化100萬資料

mysql 這個資料庫絕對是適合dba級的高手去玩的,一般做一點1萬篇新聞的小型系統怎麼寫都可以,用xx框架可以實現快速開發。可是資料量到了10萬,百萬至千萬,他的效能還能那麼高嗎?一點小小的失誤,可能造成整個系統的改寫,甚至更本系統無法正常執行!好了,不那麼多廢話了。用事實說話,看例子 資料表 c...