程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql分頁丟數據的分析

mysql分頁丟數據的分析

編輯:MySQL綜合教程

mysql分頁丟數據的分析


1 有問題的代碼

CleverCode發現在mysql有分頁丟失數據的問題。如下面的代碼,system_user表有400萬行數據,這時候需要把這張表裡面的所有的userid取出來。這時候只能分頁取,一次取2萬。

//系統用戶表(400萬行的數據)
$systemUserTable = new systemUserTable();


// 每次取20000
$pageSize = 20000;
for($curPage = 1;; $curPage++) {
    $sql = "select userid from system_user order by userid asc limit " . (($curPage - 1) * $pageSize) . "," . $pageSize;
    
    //取數據
    $rows = $systemUserTable->fetchAll($sql);
    
    // 沒有數據了,結束
    if (empty($rows)) {
        break;
    }
    
    // 遍歷數據
    foreach ( $rows as $key => $val ) {
        $userid = $val['userid'];
        
        echo $userid."\r\n";
    }
}

2 問題分析

1)假如system_user只有10行數據(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10)。
2) 這時候每次取5行。分2兩次取。
3)正常情況第一頁取(u1,u2,u3,u4,u5),正常情況第二頁取(u6,u7,u8,u9,u10)。
4)如果在第一頁去完,第二頁取之前的時間間隙裡面。u2,u3被刪除了。
5)那麼第二頁取的時候。數據變成了(u1,u4,u5,u6,u7,u8,u9,u10)。
6)那麼取出來第二頁的數據就變成了(u8,u9,u10)。

7)u6,u7被丟失了。

3 解決方案

每次取的時候where帶著最大偏移量。如下面的代碼。
$systemUserTable = new systemUserTable();
        
// 每次取20000
$pageSize = 20000;


// 每頁最大編號
$pageMaxId = 0;


while ( 1 ) {
    $sql = "select userid from system_user where userid > ${pageMaxId} order by userid asc limit " . $pageSize;
    
    //取數據
    $rows = $fyHouse->fetchAll($sql);
    
     // 沒有數據,結束
    if (empty($rows)) {
        break;
    }
    
    // 遍歷數據
    foreach ( $rows as $key => $val ) {
        $userid = $val['userid'];
        
        // 記錄當前最大分頁編號
        if ($userid > $pageMaxId) {
            $pageMaxId = $userid;
        }
        
        echo $userid."\r\n";
    }
}

過程分析:
1)system_user只有10行數據(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10)。
2) 第一次取,最大偏移量0,limit 5;則取出(u1,u2,u3,u4,u5)。記錄最大的偏移量u5的值。
4)如果在第一頁去完,第二頁取之前的時間間隙裡面。u2,u3被刪除了。
5)那麼第二頁取的時候。數據變成了(u1,u4,u5,u6,u7,u8,u9,u10)。
3)第二次取,最大偏移量u5,limit 5;則取出(u6,u7,u8,u9,u10)。記錄最大的偏移量u10的值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved