innodb引擎在統計方面和myisam是不同的,Myisam內置了一個計數器,所以在使用 select count(*) from table 的時候,直接可以從計數器中取出數據。而innodb必須全表掃描一次方能得到總的數量。要初步解決這個問題,需要做不同於myisam的一些工作:
1、使用第二索引(一般不使用主鍵索引),並且添加where條件,如:
select count(*) from product where comp_id>=0 ;
show index from product ;
id primary key
comp_id index
2、如果只需要粗略統計的話也可使用
show status from product; 來得到大約值
這種方法可在數據分頁中使用!
3、使用外部計數器,比如建立一個觸發器來計數或者在程序上使用緩存方式定時計數,缺陷是這些方法會額外消耗一些資源!
===========================
我們知道當mysql采用InnoDB時,count表的記錄數隨時都會發生變化,特別是在delete和insert比較頻繁的時候,這個問題以前注 意過,但由於很長時間沒關注,忘了,今天特別在服務器上測試了一下,每次count時都會出現一個很離譜的統計數(select count(*) from user)
解決方法有一下幾種,歡迎補充:
1、通過統計全表記錄數時在where后面加一個有索引的字段作為條件來查詢全表數據,如:select count(tid) from posts where tid>0; tid不為主鍵,tid有索引
2、采用InnoDB的表插入數據,不刪除,刪除數據通過一個字段來標識,isDel=1表示刪除0表示正常,這樣select count(*) from posts 的數據相對准確一些
3、通過計數器來記錄表的數據總行數,添加是增1,刪除時減1;這樣獲取表記錄數是最快的,而且是最復雜的