mysql - 對(duì)單表大量數(shù)據(jù)進(jìn)行報(bào)表匯總有什么高效的方法
問(wèn)題描述
我有一個(gè)表記錄了系統(tǒng)中所有功能的使用日志,精確到秒,我們簡(jiǎn)稱為秒表?,F(xiàn)在有需求是,分別制作對(duì)應(yīng)的功能使用次數(shù)匯總,年,月,日,3個(gè)維度的報(bào)表。這個(gè)秒表1個(gè)月大概會(huì)增加400W條數(shù)據(jù)。
我的做法是,每一個(gè)月手動(dòng)執(zhí)行一次匯總方法。1.先把秒表匯總出日表2.再?gòu)娜毡韰R總出月表3.再?gòu)脑卤韰R總出年表4.然后刪除秒表的數(shù)據(jù),只保留最近7天的
這個(gè)方案有幾個(gè)弊端,1.就是第一步,從秒表匯總出日表的時(shí)候,由于數(shù)據(jù)量太大,一個(gè)groupby一般都要卡很長(zhǎng)時(shí)間,有時(shí)候還會(huì)假死。2.就是第四步,為了避免第一步數(shù)據(jù)量太大,所以才在匯總后刪除用過(guò)的數(shù)據(jù)。但是這樣刪除之后,就等于丟失了實(shí)時(shí)數(shù)據(jù)。
所以。。。想問(wèn)問(wèn)大神們平時(shí)是怎么處理這些情況的,有什么更好的方案?
問(wèn)題解答
回答1:1、你的第一步可以按照小時(shí)groupby 這樣時(shí)間不會(huì)太長(zhǎng)2、可以將秒表分表處理,即1周一個(gè)表,或者1天一個(gè)表,這樣也可以解決這些問(wèn)題。
回答2:把第一步“先把秒表匯總出日表”分散到每天執(zhí)行前一天的數(shù)據(jù),寫(xiě)個(gè)腳本,crontab定時(shí)每天執(zhí)行一次。另外這種log型的數(shù)據(jù),可以試試mongodb
回答3:數(shù)據(jù)產(chǎn)生時(shí)就已經(jīng)做好報(bào)表數(shù)據(jù)的路過(guò)。把數(shù)據(jù)扔給elasticsearch試試速度。400w的數(shù)據(jù)而已,對(duì)mysql還是小意思的。另外,我推薦PostgreSQL
回答4:梳理sql,減少慢查詢。通過(guò)多次查詢來(lái)組合數(shù)據(jù)優(yōu)化數(shù)據(jù)結(jié)構(gòu),操作+時(shí)間應(yīng)該是一個(gè)索引(或者是時(shí)間+操作)。其實(shí)簡(jiǎn)而言之就是減少?gòu)?fù)雜sql,盡量通過(guò)其他方法去彌補(bǔ)。
回答5:大體是幾個(gè)思路:1、將每月匯總的工作,分解到每一天,這樣出月度最終結(jié)果的時(shí)間會(huì)比較短。2、為避免秒表的數(shù)據(jù)一直增大,可以考慮按照月度進(jìn)行表分區(qū),每月將上個(gè)月的數(shù)據(jù)移動(dòng)到另外一個(gè)歷史表,保持秒表的大小可控。另外一種方法是每月的數(shù)據(jù)進(jìn)入結(jié)構(gòu)相同、名稱不同的表,從方案上就規(guī)避了秒表過(guò)大的問(wèn)題。
相關(guān)文章:
1. css - 新手做響應(yīng)式布局, 斷點(diǎn)過(guò)后右側(cè)出現(xiàn)空白,求幫助,謝謝。2. javascript - 關(guān)于<a>元素與<input>元素的JS事件運(yùn)行問(wèn)題3. css3 - 純css實(shí)現(xiàn)點(diǎn)擊特效4. mysql - 查詢字段做了索引為什么不起效,還有查詢一個(gè)月的時(shí)候數(shù)據(jù)都是全部出來(lái)的,如果分拆3次的話就沒(méi)問(wèn)題,為什么呢。5. mysql - 記得以前在哪里看過(guò)一個(gè)估算時(shí)間的網(wǎng)站6. 大家好,我想請(qǐng)問(wèn)一下怎么做搜索欄能夠搜索到自己網(wǎng)站的內(nèi)容。7. ID主鍵不是自增的嗎 為什么還要加null8. MySQL中的enum類型有什么優(yōu)點(diǎn)?9. python - 啟動(dòng)Eric6時(shí)報(bào)錯(cuò):’qscintilla_zh_CN’ could not be loaded10. javascript - vue 怎么渲染自定義組件
