<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 一,有問題的代碼 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"; } } ~~~ ### 二,問題分析 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被丟失了。 ### 三,解決方案 每次取的時候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的值。 ![](https://box.kancloud.cn/2016-03-29_56fa2a0c7acf5.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看