標籤:
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;這樣擷取表記錄數是最快的,而且是最複雜的
mysql innodb count(*)速度慢且不準確的解決辦法