2019-08-17第十四講:count(*)這么慢[mysql實(shí)戰(zhàn)45講]

需求: 需頻繁統(tǒng)計(jì)總記錄數(shù).

1. count(*)實(shí)現(xiàn)方式

? ? 1.MyISAM ==> 總行數(shù) 寫盤 ==> 很快

? ? 2.InnoDB ==> 從引擎中一行行讀數(shù)據(jù), 累計(jì) ==> 很慢

? ? 注意: 有where則MyIASM沒(méi)那么快

? ? 3. 為什么Innodb 不存起來(lái)?? ==> 支持事務(wù) , MVCC? ==> 可見(jiàn)的行才能從引擎中取出來(lái).

? ? 4. count(*) 還是做了優(yōu)化的 ==> 哪個(gè)索引樹(shù)小 ,就掃描哪個(gè)

?數(shù)據(jù)庫(kù)系統(tǒng)設(shè)計(jì)法則: 保證邏輯正確前提下, 盡量減少掃描的數(shù)據(jù)量.?

? ? 5.show table status? ==> 是根據(jù)索引統(tǒng)計(jì)采樣估算的, 誤差40% -50%?


2.用緩存系統(tǒng)保存計(jì)數(shù).

? ? 1.使用redis ==> 可能會(huì)丟失更新 ==> 解決方案: 如果redis異常重啟, 則查一遍count(*), 再放進(jìn)緩存中

? ? 2.使用redis ==> 邏輯上不精確


1.插入數(shù)據(jù), 再加1
2. redis加1? 再插入

3.在數(shù)據(jù)庫(kù)保存計(jì)數(shù) ==> 推薦使用

? ? ? ? ? ? 1.解決崩潰丟失問(wèn)題

? ? ? ? ? ? 2.解決并發(fā)問(wèn)題

4.不同的count用法

? ? 1.count()

? ? ? ? what: 是一個(gè)聚合函數(shù) ,對(duì)于返回結(jié)果集一行行的判斷, 不是null就累計(jì)加1.

? ? 2.原則:?

? ? ? ? 1.server層要什么就給什么

? ? ? ? 2.Innodb 只給必要的值

? ? ? ? 3.優(yōu)化器優(yōu)化了count(*)的語(yǔ)義為"取行數(shù)"

? ??????

? ? 3.count(主鍵) :? 遍歷表,? 取每行id, 返回server,? server判斷不可能為空, 累加

? ? ? ? count(1) :? 遍歷表, 不取值, server每行放一個(gè)1,??server判斷不可能為空, 累加

? ? ? ? count(字段):?遍歷表,? 取每行字段, 返回server,? server判斷是否為空, 累加

? ? ? ? count(*): 遍歷表, 不取值, 按行累加 ==> 專門優(yōu)化過(guò)

? ? 4.結(jié)論: 效率排序:? ? * > 1 > 主鍵 > 字段.?

注意: 兩個(gè)不同的存儲(chǔ)系統(tǒng), 不支持分布式事務(wù), 無(wú)法拿到精確一致的視圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容