雖然是乙個postgresql的問題,但是打了各種資料庫標籤。那麼我就從mongodb和nosql的角度說說這個問題。因為一些情況不是特別清楚,基於自己的假設來回答,如果有和你情況不符的地方再提出來。
資料庫的日常應用無非olap和oltp兩大類,你的應用是乙個比較典型的olap應用。通常olap的特點是對時效性的要求不是非常高,對系統資源占用比較重。你沒有提對時效性要求到底有多高,還有你們資料的寫入模式是怎樣的。每天某個時間批量匯入?或是隨時從其他系統寫入?不管怎樣,還是有一些通用的辦法來應對的。以下是無論使用哪種資料庫都可以做的一些事情:
預聚合從你的描述來看這是個比較典型的時序資料,過去的資料是不會變的。所以可以在每天結束時把這一天的資料先聚合好,某年某月某日有多少次攻擊多少次惡意訪問之類。如果要查一段時間的,則可以把已經按天統計好的資料再聚合一次。比如乙個月的就是30條資料再次聚合,這比30x100w=3000w條資料的聚合要輕鬆很多。如果你的統計粒度需要比天還小,那就要看具體小到什麼程度。如果是精確到時,那我可能還是會考慮按小時預聚合,這樣統計比如過去30天的資料,就會有30x24=720條資料,也在接受範圍內。但是如果統計範圍允許到年,則有365x24=8760,情況就不是很樂觀了。當然如果需要精確到分鐘,那又是更麻煩的事情。但即使這樣,預聚合仍然能有效減少資料量從而降低運算所需的時間和資源。為了解決小粒度聚合的問題,實際應用中可能需要進行多個層次的預聚合。比如按月,按天,按時,按分分別聚合好,這樣在需要某分鐘到某分鐘的資料時,可以把大粒度的範圍通過月、天、時先消化掉,剩下的兩頭零碎部分再用時、分鐘處理,這樣最大程度上減小需要聚合的資料量。
索引優化
無論使用哪種資料庫,索引優化都是很重要的步驟。按上述方法預聚合後,各種時間因素肯定都是需要在索引中的。如果在時間基礎上還需要對某個主機或網域名稱等篩選,則最好是有這些欄位的聯合索引。具體問題具體分析,這個還需要你根據自己的表結構和查詢去優化。
讀寫分離
無論怎麼優化,olap對資源的占用都是不能忽略的。如果你的資料是實時寫入,聚合期間很容易受到i/o瓶頸的影響。所以最好是把接受資料和分析資料的結點分開。
安利時間
說說如果使用mongodb還有哪些事情可以做。
分片。水平擴充套件是nosql的特色之一,理論上所需時間和結點數量成反比。而資料量的增長在分布式環境中也不是乙個問題。
tag aware sharding。mongodb分片的特色,可以把舊資料自動歸集到容量大,但是效能相對差的硬體上,這樣讓熱資料始終保持在效能較好的機器上達到更好的效果。
天然的讀寫分離和高可用。複製集本身就可以實現讀寫分離和高可用。相信這兩個特性對任何應用都是很有意義的。
最後還是要提醒一點,理論歸理論,沒有乙個方案是完美的,實際應用時肯定還會遇到各種各樣奇怪的問題。程式設計是一項創造性的工作,需要你自己在實踐中不斷尋找最優的解決方案,在實踐中成長。
土豆片開發日誌 海量資料採集
偶然發現 的店鋪街的店鋪鏈結都打不開了,沒想到 也出現這類錯誤,估計今天會影響到很多使用者的體驗度。研究 的店鋪很久了,原以為店鋪街是比較好的店鋪,但是後來發現原來這個店鋪街不是以前 的那個店鋪街了,以前的店鋪街發展成為現在的 一般 的東西比較好,也難怪最近土豆片 http www.tudoupia...
織夢mysql日誌儲存 MySQL日誌筆記
mysql日誌筆記1 mysql日誌比較日誌檔案檔案中的資訊作用錯誤日誌記錄啟動 執行或停止mysqld時出現的問題。系統故障時定位故障原因查詢日誌記錄建立的客戶端連線和執行的語句。記錄發生的所有操作二進位制日誌記錄所有更改資料的語句。資料庫資料備份和複製慢 mysql日誌筆記 1 mysql日誌比...
mysql日誌類資料儲存 MySQL 日誌管理詳解
大綱 一 日誌分類 二 日誌詳解 注 mysql版本,mysql 5.5.32 不同版本的mysql變數有所不同 一 日誌分類 錯誤日誌 查詢日誌 慢查詢日誌 二進位制日誌 中繼日誌 事務日誌 滾動日誌 二 日誌詳解 1.錯誤日誌 說明 在對應的資料目錄中,以主機名 err命名的檔案,錯誤日誌記錄的...