首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP + MySQL 分頁機制效能比較:LIMIT vs 游標位移

     編輯:PHP 綜合知識

兩種分頁策略

策略SQL特點
A: LIMIT 偏移SELECT * FROM t WHERE cond LIMIT offset, perpage資料庫內部跳過 offset 列,大偏移時效能下降
B: 游標/記憶體SELECT * FROM t WHERE cond + mysql_data_seek()一次撈全表至記憶體,PHP 端定位,大資料量記憶體爆炸

實測數據分析 (舊環境:PIII 550/128MB/Win98)

記錄數   方案   平均耗時(秒)  效率比
10,000   A      1.6           4.8x
         B      7.7
20,000   A      7.5           6.7x
         B      49.9
30,000   A      26.0          3.3x
         B      86.6

結論:LIMIT 方案 (A) 全勝。游標方案 (B) 隨資料量線性惡化,記憶體與網路傳輸為瓶頸。

現代資料庫優化原理

LIMIT 偏移深分頁問題

MySQL LIMIT 1000000, 20 仍需掃描前 1,000,000 列再捨棄。解法:

  • 延遲關聯:SELECT * FROM t INNER JOIN (SELECT id FROM t WHERE cond ORDER BY id LIMIT 1000000, 20) tmp USING (id)
  • 游標分頁:WHERE id > last_id ORDER BY id LIMIT 20 (需唯一排序鍵、不支援跳頁)
  • 覆蓋索引:INDEX (cond_col, id) 讓子查詢只掃索引

PHP 端分頁類別封裝 (PDO)

perPage;
        
        // 總數
        $total = $this->pdo->prepare("SELECT COUNT(*) FROM {$this->table} WHERE {$this->where}");
        $total->execute($this->params);
        $totalRows = $total->fetchColumn();
        
        // 資料 (延遲關聯優化)
        $sql = "SELECT t.* FROM {$this->table} t
                INNER JOIN (
                    SELECT id FROM {$this->table} WHERE {$this->where} ORDER BY id LIMIT :offset, :limit
                ) tmp USING (id)";
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->bindValue(':limit', $this->perPage, PDO::PARAM_INT);
        foreach ($this->params as $k => $v) {
            $stmt->bindValue($k, $v);
        }
        $stmt->execute();
        $rows = $stmt->fetchAll();
        
        return [
            'data' => $rows,
            'current_page' => $page,
            'per_page' => $this->perPage,
            'total' => $totalRows,
            'last_page' => ceil($totalRows / $this->perPage),
        ];
    }
}

大數據量替代方案

  • Elasticsearch / OpenSearch:分散式搜尋、深分頁高效
  • ClickHouse / Apache Druid:OLAP 引擎、毫秒級聚合
  • 資料倉庫 + 物化視圖預聚合
  • 前端無限滾動 (游標分頁) 替代傳統頁碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved