1. 程式人生 > >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的值。


相關推薦

mysql資料分析

1 有問題的程式碼 CleverCode發現在mysql有分頁丟失資料的問題。如下面的程式碼,system_user表有400萬行資料,這時候需要把這張表裡面的所有的userid取出來。這時候只能分頁取,一次取2萬。 //系統使用者表(400萬行的資料) $systemUs

PHP+MySQL顯示示例分析

moc dwl _array t-sql 4g+ scw zax d+ ffi Web開發是今後分布式程式開發的主流,通常的web開發都要涉及到與數據庫打交道,客戶端從服務器端讀取通常都是以分頁的形式來顯示,一頁一頁的閱讀起來既方便又美觀。所以說寫分頁程序是web開發的一個

Mybatis+MySQL動態查詢資料經典案例(含程式碼以及測試)

             最近在用Mybatis做專案的時候遇到了不少問題,今天我就在這和大家分享一下,稀稀拉拉的研究了兩天,終於搞好了!     開發人員:1111     開發軟體:Myeclipse     用到的框架技術:Mybatis     資料庫:MySql  

Mybatis+mysql動態查詢資料案例——配置對映檔案(HouseDaoMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/myba

mysql加排序資料重複問題解決方案

前言 又一次我給商品資料分頁並按照權重欄位排序,結果出現了資料重複問題,第一頁資料和第二頁資料有重複 其實,這個問題很簡單,如果你有仔細閱讀官檔的話。~^_^~ 我們先來看看官檔是怎麼說的: If multiple rows have identical val

海量的簡單分析

elk mic als emc usb won tm4 pop iap 此文僅個人理解,不到之處望指出 提出:easyui的datagrid組件有海量分頁的內容,通過查詢數據庫的所有數據在表格進行分頁瀏覽,因為數據量多,也叫海量分頁, 網

MySQL優化中的“INNER JOIN方式優化算法”到底在什麽情況下會生效?

表結構 files key 效率 ref 兩個 ges 參考 如果 本文出處:http://www.cnblogs.com/wy123/p/7003157.html 最近無意間看到一個MySQL分頁優化的測試案例,並沒有非常具體地說明測試場景的情況下,給出了

Mysql處理(PageHelper)

展示 文件中 感覺 但是 pre 模糊查詢 map art lec 第一次做分頁處理(完全不知道分頁處理到底要做成什麽樣?) 理解:其實就是前臺頁面通過傳遞不同的參數{1.查詢的條件。2.查詢頁數(pageNum),3每頁展現的條數(pageSize)},之後我們(只做後臺

SpringMVC+Mybatis實現的Mysql數據查詢

space round nbsp sub hid append app return utf   周末這天手癢,正好沒事幹,想著寫一個分頁的例子出來給大家分享一下。   這個案例分前端和後臺兩部分,前端使用面向對象的方式寫的,裏面用到了一些回調函數和事件代理,有興趣的朋友可

php+Mysql 類和引用詳解

echo padding 數字 進行 else if sub var min func 一下內容為專用於分頁的類以及具體的方法和解析。<?php class Page { private $total;

MySQL查詢優化

插入 hist shel 使用範圍 表優化 方便 歷史 生成器 速度 當需要從數據庫查詢的表有上萬條記錄的時候,一次性查詢所有結果會變得很慢,特別是隨著數據量的增加特別明顯,這時需要使用分頁查詢。對於數據庫分頁查詢,也有很多種方法和優化的點。下面簡單說一下我知道的一些方法。

Mysql優化

mce 及其 過大 order by 意義 可能 就是 處理 con   在mysql中limit可以實現快速分頁,但是如果數據到了幾百萬時我們的limit必須優化才能有效的合理的實現分頁了,否則可能卡死你的服務器。當一個數據表中有幾百萬條數據的時候,就成問題了!   例

MySQL 優化

明顯 並不是 sql log family soft blog offset device MySQL 用 LIMIT offset, length 進行分頁。但當表記錄數很大,會發現大頁數的查詢時間明顯比小頁數的查詢時間大。 MySQL並不是跳過 offset 行,而是取

mysql

mysql分頁1.分頁的概念分頁就是將數據以多頁展示出來,使用分頁的目的是為了提高用戶的體驗2.分頁的分類:物理分頁和邏輯分頁物理分頁:物理分頁就是數據庫本身提供了分頁方式,如mysql的limit,好處是效率高,不好的地方就是不同數據庫有不同的搞法。邏輯分頁:邏輯分頁利用遊標分頁,好處是所有數據庫都統一,壞

mysql性能

div limit 數據 class 記錄 sql分頁 IT 索引 userinfo - select * from userinfo limit 20000,10 # 數據越往後越慢 - 索引表中掃:  select * from userinfo where

Flask呈現資料時序號按流水號顯示

將資料庫中查詢出來的內容按照新增時間降序呈現到頁面,呈現時頁面中有“編號”列。 從資料庫中查詢資料並放到頁面中呈現把並不複雜: 在路由中利用PythonSQLAlchemy將資料內容從資料庫中查出並進行分頁處理。 資料一共有12條,每頁顯示10條資料。 @admin_blu.rout

【小程式】載入資料,下拉載入更多,上拉重新整理

【 小程式】分頁載入資料,下拉載入更多,上拉重新整理 分頁載入的優點就不多說了,下面主要記錄一下幾個問題點。 scroll-view元件不能用在頁面根佈局中,不然觸發不了系統的onPullDownRefresh()、onReachBottom()回撥。 在Page頁

mysqlmysql中利用編號id和每條數來進行

1.mysql分頁 【語句順序】        select 選擇的列        from 表  

ssm框架整合入門系列——查詢-顯示資料

ssm框架整合入門系列——查詢-分頁顯示資料(pageHelper的使用) 查詢也就是顯示操作,在該專案下具體表現為: 訪問index.jsp頁面 index.jsp頁面傳送出查詢員工列表請求 EmployeeController 來接受請求,查出員工資料 來到list.jsp頁面進

例項:建立一個表格,顯示資料(MongoDB資料庫儲存),功能:實現增刪改查

需求:建立一個表格,分頁顯示資料,功能:實現增刪改查 效果圖: 自動建立一個專案 命令列: express mongodb-demo --view=ejs cd mongodb-demo npm install npm install mongodb --save npm sta