mysql - 對(duì)單表大量數(shù)據(jù)進(jìn)行報(bào)表匯總有什么高效的方法
問(wèn)題描述
我有一個(gè)表記錄了系統(tǒng)中所有功能的使用日志,精確到秒,我們簡(jiǎn)稱(chēng)為秒表。現(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,減少慢查詢(xún)。通過(guò)多次查詢(xún)來(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)相同、名稱(chēng)不同的表,從方案上就規(guī)避了秒表過(guò)大的問(wèn)題。
相關(guān)文章:
1. 小白學(xué)python的問(wèn)題 關(guān)于%d和%s的區(qū)別2. javascript - 使用vue做個(gè)抽獎(jiǎng)問(wèn)題3. javascript - 請(qǐng)教移動(dòng)端從詳情頁(yè)返回到列表頁(yè)原來(lái)位置的問(wèn)題?4. javascript - vuex中子組件無(wú)法調(diào)用公共狀態(tài)5. javascript - webpack 打包 reactjs項(xiàng)目 css 分離6. javascript - (_a = [""], _a.raw = [""],....); js一個(gè)小括號(hào)的是什么意思?7. javascript - 關(guān)于微信掃一掃的技術(shù)問(wèn)題8. javascript - js正則替換日期格式問(wèn)題9. javascript - 關(guān)于js高級(jí)程序中的問(wèn)題10. javascript - ES5的閉包用ES6怎么實(shí)現(xiàn)
