分頁需兩條 SQL:SELECT ... LIMIT 10 取數據 + SELECT COUNT(*) 取總數。FOUND_ROWS() 可合為一查。
-- 1. 查詢加 SQL_CALC_FOUND_ROWS SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; -- 2. 緊接著調用 SELECT FOUND_ROWS(); -- 返回無 LIMIT 時的總行數
關鍵: 必須加SQL_CALC_FOUND_ROWS,否則FOUND_ROWS()僅返回實際返回行數。
SELECT SQL_CALC_FOUND_ROWS * FROM actionlist WHERE A_ID > 0 LIMIT 10; SELECT FOUND_ROWS(); -- Workbench 顯示 1,命令列正常
解決: 切換到 MySQL Command Line Client 或程序代碼中驗證,Workbench 的結果集處理機制導致。
SQL_CALC_FOUND_ROWS 會掃描全表(不走 LIMIT 優化),大表慎用COUNT(*) 走覆蓋索引 + 緩存總數SQL_CALC_FOUND_ROWS,推薦兩條獨立查詢-- 方案 1:覆蓋索引 COUNT(*) SELECT COUNT(*) FROM tbl_name WHERE id > 100; -- 極快 -- 方案 2:應用層緩存總數(Redis) -- 方案 3:估算總數(EXPLAIN rows)