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

MySQL FOUND_ROWS() 分頁查詢總筆數用法詳解與坑點避雷

     編輯:MySQL 綜合教學

MySQL FOUND_ROWS() 獲取無 LIMIT 總筆數:正確用法與常見坑點

分頁查詢常見需求:同時取得「前 N 筆資料」與「符合條件的總筆數」。MySQL 提供 SQL_CALC_FOUND_ROWS + FOUND_ROWS() 機制解決此問題,避免執行兩次查詢。

正確語法

-- 第 1 句:查詢資料並要求計算總筆數
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;

-- 第 2 句:緊接著取得總筆數(忽略 LIMIT)
SELECT FOUND_ROWS();

關鍵點

  • SQL_CALC_FOUND_ROWS **不可省略**,它告訴伺服器「雖然有 LIMIT,但請幫我算出無 LIMIT 時的總行數」。
  • 兩句必須在**同一連線/同一 Session** 連續執行,中間不能插入其他查詢,否則 FOUND_ROWS() 會被重置。
  • 適用於 MyISAM、InnoDB 等儲存引擎。

實測坑點:MySQL Workbench 執行 FOUND_ROWS() 永遠回傳 1

現象: 在 MySQL Workbench 執行上述兩句,FOUND_ROWS() 總回傳 1,但實際符合條件筆數遠大於 1。
原因: Workbench 可能將兩句拆分為不同連線或隱性提交,導致 Session 狀態丟失。
驗證: 改用 MySQL Command Line Client 或程式碼(連線池保持同一連線)執行,結果正確。
建議: 生產程式碼中使用連線池確保同一連線;手工測試請用命令列客戶端。

效能提示

SQL_CALC_FOUND_ROWS 會掃描全表符合條件的行,大數據量下較慢。替代方案:

  • 單獨跑 SELECT COUNT(*) FROM tbl_name WHERE id > 100;(可利用覆蓋索引極快)。
  • 應用層快取總筆數,定期非同步更新。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved