業務高頻需求:取最大 ID、下一個自增值、表行數。本文對比 4 種查法的效能、適用場景與陷阱。
SELECT MAX(id) FROM your_table;
SHOW TABLE STATUS LIKE 'table_name';
-- Auto_increment 欄位即為下一個自增值
PHP 範例:
$sql = "SHOW TABLE STATUS LIKE 'table_name'";
$res = mysql_query($sql);
$row = mysql_fetch_assoc($res);
echo $row['Auto_increment'];
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name';
SELECT MAX(id) + 1 FROM table_name;
-- 刪除/回滾/重啟導致自增值 > MAX(id),此法不可靠
| 方法 | SQL | 效能 | 準確性 | 適用場景 |
|---|---|---|---|---|
| COUNT(*) | SELECT COUNT(*) FROM table | MyISAM 極快(存計數),InnoDB 全表掃描 | 精確 | MyISAM/小表 |
| COUNT(主鍵) | SELECT COUNT(id) FROM table | 同 COUNT(*) | 精確 | InnoDB 小/中表 |
| SQL_CALC_FOUND_ROWS | SELECT SQL_CALC_FOUND_ROWS * FROM t; SELECT FOUND_ROWS(); | 雙查詢,有開銷 | 精確 | 需同時取資料與總數 |
| SHOW TABLE STATUS | SHOW TABLE STATUS LIKE 'table' | **最快**(元資料) | **近似值**(InnoDB 統計估算) | 大表快速估算、分頁總頁數 |
COUNT(*) 無 WHERE 時 O(1) 讀取儲存計數COUNT(*) 需掃描聚集索引,**大表極慢**SHOW TABLE STATUS 的 Rows 欄位(誤差 ±10%)SELECT COUNT(*) FROM t WHERE id > 0 強制走二級索引(較快)或維護計數表/Redis 快取| 需求 | 首選方案 | 備選 |
|---|---|---|
| 最大 ID | SELECT MAX(id) FROM t | — |
| 下一自增值 | SHOW TABLE STATUS LIKE 't' | information_schema |
| 精確行數(小表) | SELECT COUNT(*) FROM t | COUNT(id) |
| 近似行數(大表) | SHOW TABLE STATUS LIKE 't' → Rows | EXPLAIN SELECT * FROM t → rows |
指標查詢看似簡單,引擎特性差異巨大,選對工具事半功倍。