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

MySQL 複雜查詢分頁優化:ID 預查詢 + 臨時表/Session 緩存方案

     編輯:PHP 相關知識

痛點:LIMIT m,n 在複雜條件下的效能崩潰

有索引時 LIMIT m,n 較快,但複雜條件(如 WHERE ... ORDER BY field1+field2)會導致 MySQL 全表掃描取出所有符合條件記錄再切片。數十萬資料量下,用戶翻閱尾頁會引發大量磁碟 I/O。

核心思路:模擬「存儲分頁」機制

一次性查詢符合條件的主鍵 ID 集合,後續分頁直接按 ID 列表精確取回,避免重複掃描。

步驟 1:預查詢 ID 集合

SELECT id FROM `$table` WHERE `$condition` ORDER BY `$field` LIMIT $max_pages*$count;
  • 可限制最大回傳筆數($max_pages * $count),防止記憶體暴增
  • 若不加 LIMIT 需評估記憶體風險

步驟 2:ID 集合持久化(二選一)

方案實作方式優缺點
A. MySQL 臨時表 建立臨時表,以時間戳/隨機數為唯一標識存入;欄位 page1~pageN 儲存各頁 ID 列表 跨請求共享,需定期清理過期表
B. PHP Session 將二維陣列 $IDs[page][id_list] 存入 $_SESSION(實際落檔) 輕量簡單,但多視窗並發需唯一標識區分(如二維陣列鍵名或 $$var)

步驟 3:分頁精確取回

SELECT * FROM `$table` WHERE id IN ($ids);  -- $ids 為逗號分隔的 ID 字串

主鍵查詢極快,徹底解決深分頁效能問題。

討論與延伸

  • ASP Recordset 分頁將大量資料載入記憶體,失效機制不明確
  • SQL Server 游標/預存程序分頁原理類似,但過期結果清理機制需自行設計
  • 本方案為概念驗證,歡迎實測回饋優化細節(如臨時表清理策略、Session 髒資料處理)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved