某天寫了一段crud,提測給qa,後來想起來忘記按規則排序了,然後修改了**提交,這個時候qa扔給我一條狗,不,是乙個bug。
內心一片憂傷,crud也有bug啊,怎麼辦怎麼辦,趕緊看看去。
bug描述:分頁查詢出來的資料有重複和遺漏。這個地方用乙個測試表來描述吧。
create資料表product_info中共有8條資料。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=
'商品表
'
分頁查詢第一頁:
分頁查詢第二頁:
結論:從圖上我們可以看到 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...