count(*)為什么慢?
**MyISAM **
MyISAM 引擎把一個表的總行數存在了磁盤上,因此執行 count(*) 的時候會直接返回這個數,效率很高;
InnoDB
而 InnoDB 引擎就麻煩了,它執行 count(*) 的時候,需要把數據一行一行地從引擎里面讀出來,然后累積計數。
因為,innoDB要支持並發和事務
mysql的小優化
InnoDB 是索引組織表,主鍵索引樹的葉子節點是數據,而普通索引樹的葉子節點是主鍵值。所以,普通索引樹比主鍵索引樹小很多對於 count(*) 這樣的操作,遍歷哪個索引樹得到的結果邏輯上都是一樣的。因此,MySQL 優化器會找到最小的那棵樹來遍歷。在保證邏輯正確的前提下,盡量減少掃描的數據量,是數據庫系統設計的通用法則之一。
優化
可以在表上加上一個計數字段,或者設計一張單獨的表來存儲計數
查詢記錄數效率
按照效率排序的話,count(字段)<count(主鍵 id)<count(1)≈count(*),所以盡量使用 count(*)。