首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL FOUND_ROWS() 分頁優化:無需重複查詢獲取總記錄數

     編輯:MySQL 資料庫相關知識

場景痛點

分頁需兩條 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() 僅返回實際返回行數。

實戰遇坑:Workbench 返回 1

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(*) 走覆蓋索引 + 緩存總數
  • MySQL 8.0.17+ 已棄用 SQL_CALC_FOUND_ROWS,推薦兩條獨立查詢

現代替代方案

-- 方案 1:覆蓋索引 COUNT(*)
SELECT COUNT(*) FROM tbl_name WHERE id > 100;  -- 極快

-- 方案 2:應用層緩存總數(Redis)
-- 方案 3:估算總數(EXPLAIN rows)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved