MyISAM 內置行數計數器,SELECT COUNT(*) FROM table 瞬時返回。InnoDB 因 MVCC 多版本特性,不同事務可見行數不同,無法維護全局計數器,必須全表/全索引掃描計算。
SELECT COUNT(*) FROM product WHERE comp_id >= 0;
SHOW INDEX FROM product;
-- comp_id 為普通索引,非主鍵
原理:InnoDB 掃描較小的輔助索引樹而非聚簇索引,配合 WHERE 條件觸發索引範圍掃描,大幅提速。注意:無 WHERE 條件的 COUNT(*) 仍會全表掃描。
SHOW TABLE STATUS LIKE 'product';
-- 關注 Rows 字段,為統計近似值
適用於分頁、儀表盤等不需精確計數的場景,毫秒級返回。
缺點:增加寫入開銷、需處理一致性、代碼複雜度上升。
InnoDB 並非所有 COUNT(*) 都慢,僅無 WHERE 條件的全表計數慢。帶索引條件的 COUNT(*) 與 MyISAM 性能相近。實際業務多為條件計數,影響較小。