一、count(*)的實現(xiàn)方式
首先我們要知道,不同數(shù)據(jù)庫引擎的實現(xiàn)方式是不同的,比如MyISAM引擎是存在磁盤上的,需要的話會直接返回,效率高,但是InnoDB引擎需要一行行地從引擎讀出來,然后累計計數(shù)。
1.比較MyISAM、InnoDB、show table status的不同
MyISAM的效率最高,但是不支持事務;
show table status是用抽樣統(tǒng)計法計數(shù),雖然很快,但是不準確;
InnoDB會遍歷全表,雖然準確,但是會導致性能問題;
二、在新增和刪除較多的表中,需要頻繁統(tǒng)計的需求中怎么優(yōu)化?
- 如果用redis緩存,會存在如果Redis意外宕機,緩存的數(shù)據(jù)會丟失,這還不是最關鍵的,最重要的是不能數(shù)據(jù)更新的支持事務,數(shù)據(jù)邏輯上是不準確的。
- 如果用表來存儲,就可以保證事務。而且數(shù)據(jù)庫崩潰也可以通過日志來恢復。
三、比較MySQL中count(字段)、count(主鍵id)、count(1)、count(*)的效率。
因為count( * ) 是被MySQL優(yōu)化過的,在計數(shù)的時候不會把所有的信息都返回到內存,如果不為null,就會在內存中+1;
所以效率排序是:count(*)>count(1)>count(主鍵id)>count(字段)
四、思考題
用一個計數(shù)表記錄一個業(yè)務表的總行數(shù),在往業(yè)務表插入數(shù)據(jù)的時候,需要給計數(shù)值加 1。邏輯實現(xiàn)上是啟動一個事務,執(zhí)行兩個語句:insert into 數(shù)據(jù)表;update 計數(shù)表,計數(shù)值加 1。從系統(tǒng)并發(fā)能力的角度考慮,怎么安排這兩個語句的順序。