需求: 需頻繁統(tǒng)計總記錄數(shù).
1. count(*)實(shí)現(xiàn)方式
? ? 1.MyISAM ==> 總行數(shù) 寫盤 ==> 很快
? ? 2.InnoDB ==> 從引擎中一行行讀數(shù)據(jù), 累計 ==> 很慢
? ? 注意: 有where則MyIASM沒那么快
? ? 3. 為什么Innodb 不存起來?? ==> 支持事務(wù) , MVCC? ==> 可見的行才能從引擎中取出來.
? ? 4. count(*) 還是做了優(yōu)化的 ==> 哪個索引樹小 ,就掃描哪個
?數(shù)據(jù)庫系統(tǒng)設(shè)計法則: 保證邏輯正確前提下, 盡量減少掃描的數(shù)據(jù)量.?
? ? 5.show table status? ==> 是根據(jù)索引統(tǒng)計采樣估算的, 誤差40% -50%?
2.用緩存系統(tǒng)保存計數(shù).
? ? 1.使用redis ==> 可能會丟失更新 ==> 解決方案: 如果redis異常重啟, 則查一遍count(*), 再放進(jìn)緩存中
? ? 2.使用redis ==> 邏輯上不精確
3.在數(shù)據(jù)庫保存計數(shù) ==> 推薦使用
? ? ? ? ? ? 1.解決崩潰丟失問題
? ? ? ? ? ? 2.解決并發(fā)問題
4.不同的count用法
? ? 1.count()
? ? ? ? what: 是一個聚合函數(shù) ,對于返回結(jié)果集一行行的判斷, 不是null就累計加1.
? ? 2.原則:?
? ? ? ? 1.server層要什么就給什么
? ? ? ? 2.Innodb 只給必要的值
? ? ? ? 3.優(yōu)化器優(yōu)化了count(*)的語義為"取行數(shù)"
? ??????
? ? 3.count(主鍵) :? 遍歷表,? 取每行id, 返回server,? server判斷不可能為空, 累加
? ? ? ? count(1) :? 遍歷表, 不取值, server每行放一個1,??server判斷不可能為空, 累加
? ? ? ? count(字段):?遍歷表,? 取每行字段, 返回server,? server判斷是否為空, 累加
? ? ? ? count(*): 遍歷表, 不取值, 按行累加 ==> 專門優(yōu)化過