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

MySQL InnoDB COUNT(*) 慢查詢優化方案

     編輯:MySQL 資料庫相關知識

為什麼 InnoDB COUNT(*) 慢?

MyISAM 內置行數計數器,SELECT COUNT(*) FROM table 瞬時返回。InnoDB 因 MVCC 多版本特性,不同事務可見行數不同,無法維護全局計數器,必須全表/全索引掃描計算。

優化方案對比

方案一:利用輔助索引 + WHERE 條件(推薦)

SELECT COUNT(*) FROM product WHERE comp_id >= 0;
SHOW INDEX FROM product;
-- comp_id 為普通索引,非主鍵

原理:InnoDB 掃描較小的輔助索引樹而非聚簇索引,配合 WHERE 條件觸發索引範圍掃描,大幅提速。注意:無 WHERE 條件的 COUNT(*) 仍會全表掃描。

方案二:SHOW TABLE STATUS 獲取近似值

SHOW TABLE STATUS LIKE 'product';
-- 關注 Rows 字段,為統計近似值

適用於分頁、儀表盤等不需精確計數的場景,毫秒級返回。

方案三:外部計數器(觸發器/緩存/定時任務)

  • 插入/刪除觸發器維護計數表
  • Redis 緩存計數,定時同步落庫
  • 應用層計數字段,事務內同步更新

缺點:增加寫入開銷、需處理一致性、代碼複雜度上升。

核心結論

InnoDB 並非所有 COUNT(*) 都慢,僅無 WHERE 條件的全表計數慢。帶索引條件的 COUNT(*) 與 MyISAM 性能相近。實際業務多為條件計數,影響較小。

參考資源

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