分頁查詢常見需求:同時取得「前 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 時的總行數」。FOUND_ROWS() 會被重置。現象: 在 MySQL Workbench 執行上述兩句,FOUND_ROWS() 總回傳 1,但實際符合條件筆數遠大於 1。
原因: Workbench 可能將兩句拆分為不同連線或隱性提交,導致 Session 狀態丟失。
驗證: 改用 MySQL Command Line Client 或程式碼(連線池保持同一連線)執行,結果正確。
建議: 生產程式碼中使用連線池確保同一連線;手工測試請用命令列客戶端。
SQL_CALC_FOUND_ROWS 會掃描全表符合條件的行,大數據量下較慢。替代方案:
SELECT COUNT(*) FROM tbl_name WHERE id > 100;(可利用覆蓋索引極快)。