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

mysql_num_rows() vs COUNT(*) 效能深度對比

     編輯:PHP 綜合知識

測試環境

  • 資料筆數:139,764 筆
  • 資料表大小:500 MB

測試結果

方法耗時(秒)
mysql_num_rows()(需 fetch 所有列)35.27
COUNT(*)(資料庫端聚合)0.07

原理差異

  • mysql_num_rows():PHP 驅動程式必須**接收完整結果集**到客戶端緩衝區,再計算行數 → 網路傳輸、記憶體佔用大、慢
  • COUNT(*):MySQL **儲存引擎層直接回傳計數**(MyISAM 為 O(1),InnoDB 掃描最小索引) → 僅傳回一個整數 → 極快

適用場景

場景建議
僅需總筆數COUNT(*)
需處理每一列資料mysql_num_rows() + 迴圈
分頁總數SELECT COUNT(*) FROM ... WHERE ...
條件複雜、需 JOINSELECT COUNT(*) FROM (複雜查詢) AS t

InnoDB COUNT(*) 注意事項

  • InnoDB 不儲存總行數,COUNT(*) 需掃描聚簇索引或次要索引
  • 大表可建立 counter table 或用 information_schema.TABLE_ROWS 估算(非精確)
  • COUNT(1)、COUNT(primary_key)、COUNT(*) 在 InnoDB 效能相同
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved