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

MySQL 統計表行數的三種姿勢:COUNT(*)、COUNT(1) 與 information_schema

     編輯:MySQL 綜合教學

MySQL 統計表行數的三種姿勢:COUNT(*)、COUNT(1) 與 information_schema

統計資料表行數是最基礎也最常見的操作,但不同寫法在性能、語義上卻有細微差別。本文梳理三種主流做法及適用場景。

1. 標準 SQL:COUNT(*) / COUNT(1)

SELECT COUNT(*) FROM tableName;
-- 或
SELECT COUNT(1) FROM tableName;
  • 語義:統計滿足條件的行數,* 與 1 在優化器層面等價,無性能差異。
  • 適用:InnoDB、MyISAM 等所有引擎;需精確行數時首選。
  • 注意:InnoDB 不鎖表,但需掃描聚簇索引(或次級索引),大表較慢;可配合 WHERE 縮小範圍。

2. 統計特定列非 NULL 值:COUNT(column)

SELECT COUNT(id) FROM tableName;
  • 語義:統計 id 列非 NULL的行數。
  • 差異:若列含 NULL,結果會小於 COUNT(*);若列有索引,優化器可能選擇掃描該索引(比聚簇索引窄),速度更快。

3. 元數據秒級查詢:information_schema

SELECT TABLE_ROWS 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name';
  • 原理:讀取存儲引擎維護的統計信息,不掃描表數據,毫秒級返回。
  • 缺陷:非實時、非精確。InnoDB 的 TABLE_ROWS 為估算值(誤差可達 40%~50%),MyISAM 則精確。
  • 適用:大表快速估算、監控儀表板、不要求精確的業務場景。

性能對比與選型建議

方法精確度速度推薦場景
COUNT(*) / COUNT(1)精確大表較慢(全掃描)業務精確統計、小中型表
COUNT(indexed_col)精確(非NULL)較快(掃描次級索引)大表且有合適索引
information_schema.TABLE_ROWS估算(InnoDB)極快大表估算、監控、非關鍵業務

進階技巧:觸發器維護計數表

若業務極度依賴實時精確行數且表極大,可建立計數表 + 觸發器維護:

CREATE TABLE table_counts (table_name VARCHAR(64) PRIMARY KEY, row_count BIGINT);
-- INSERT/DELETE 觸發器更新 row_count

讀取時直接 SELECT row_count FROM table_counts WHERE table_name='...',O(1) 精確返回。

總結

精確用 COUNT(*),估算用 information_schema,大表有索引可用 COUNT(index_col)。理解底層機制,才能在正確性與性能間做最佳取捨。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved