mysql innodb count(*)速度慢且不準確的解決辦法

來源:互聯網
上載者:User

標籤:

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(*)速度慢且不準確的解決辦法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.