一崩哩、count(*)的實現(xiàn)方式
首先我們要知道噩翠,不同數(shù)據(jù)庫引擎的實現(xiàn)方式是不同的戏自,比如MyISAM引擎是存在磁盤上的,需要的話會直接返回伤锚,效率高浦妄,但是InnoDB引擎需要一行行地從引擎讀出來,然后累計計數(shù)。
1.比較MyISAM剂娄、InnoDB蠢涝、show table status的不同
MyISAM的效率最高,但是不支持事務(wù)阅懦;
show table status是用抽樣統(tǒng)計法計數(shù)和二,雖然很快,但是不準(zhǔn)確耳胎;
InnoDB會遍歷全表惯吕,雖然準(zhǔn)確,但是會導(dǎo)致性能問題怕午;
二废登、在新增和刪除較多的表中,需要頻繁統(tǒng)計的需求中怎么優(yōu)化郁惜?
- 如果用redis緩存堡距,會存在如果Redis意外宕機(jī),緩存的數(shù)據(jù)會丟失兆蕉,這還不是最關(guān)鍵的羽戒,最重要的是不能數(shù)據(jù)更新的支持事務(wù),數(shù)據(jù)邏輯上是不準(zhǔn)確的虎韵。
- 如果用表來存儲易稠,就可以保證事務(wù)。而且數(shù)據(jù)庫崩潰也可以通過日志來恢復(fù)包蓝。
三驶社、比較MySQL中count(字段)、count(主鍵id)测萎、count(1)亡电、count(*)的效率。
因為count( * ) 是被MySQL優(yōu)化過的绳泉,在計數(shù)的時候不會把所有的信息都返回到內(nèi)存,如果不為null姆泻,就會在內(nèi)存中+1零酪;
所以效率排序是:count(*)>count(1)>count(主鍵id)>count(字段)
四、思考題
用一個計數(shù)表記錄一個業(yè)務(wù)表的總行數(shù)拇勃,在往業(yè)務(wù)表插入數(shù)據(jù)的時候四苇,需要給計數(shù)值加 1。邏輯實現(xiàn)上是啟動一個事務(wù)方咆,執(zhí)行兩個語句:insert into 數(shù)據(jù)表月腋;update 計數(shù)表,計數(shù)值加 1。從系統(tǒng)并發(fā)能力的角度考慮榆骚,怎么安排這兩個語句的順序片拍。