約 1億條記錄, 每條1k左右,key =>value形式,用於前台查詢,選擇什麼作為存儲方案比較合適呢,要求效率比較高並且相對穩定可靠?

每天需要從文件導入一次,目前想到使用mysql分表存儲,不知道有沒有更好的辦法。


對於這個小問題, 如果 key 比較小, 可以將所有 key-pos 放內存, pos 為文件中 value 的偏移, 每次訪問只需要一次磁碟seek.

用 protocol-buf 或 thrift 架成網路服務, 還可以加一層proxy, 按 key hash 分發到不同的伺服器來減小壓力.

嗯, 好像這些, beansdb 都已經做好了.


1.總元數據量是100G不到,加上主鍵索引的話,預計100G-120G

2.每天需要從文件導入一次,目前想到使用mysql分表存儲,不知道有沒有更好的辦法 ?這個不太清楚,是當下已經有1億條記錄,還是每天累加在一起之後,可能為1億條記錄

這個非常關鍵,若是每天累計在一起是1億條記錄,且是按PK查詢查詢的話,沒有必要分表

3.非常關鍵的一點,只有查詢 還是可能也提供其他的操作,比如UPDATE,INSERT,一定要確認清楚

4.查詢的話是按PK單條的方式,還是大批量的讀出,關鍵點是否需要GROUP BY 統計,ORDER BY 分頁

5.主鍵是否簡單比如1個或2個整型欄位的模式

6.採用MySQL的話,若是非常簡單的查詢,且按PK,可以考慮採用Handlersocket的模式,對於複雜的建議走SQL協議...


推薦handlersocket的技術文章資料:
HandlerSocket的原理等系列篇章
http://www.mysqlops.com/2011/10/19/handlersocket-principle.html


使用 nark 資料庫 ,顛覆傳統,比 bizp2 更高的壓縮率,同時還能高效查找,還支持的前綴搜索。


1. mongodb+redis
更酷,且對於你的場景來說,沒有風險(即使丟失1天數據,也可以重新導入),成熟可靠.
mongodb存儲數據(須使用主從or replication set),redis做cache.
2. mysql+memcached.
毫無疑問可以實現你的需求.


如果只有單台伺服器,不推薦使用redis,這麼大數據量需要全部載入到物理內存中,你的硬體成本會非常高,如果開啟vm,性能會有損失。資料庫分表是最簡單快捷,且能保證系統穩定性和可擴展性的手段之一,想嘗試新技術可考慮MySQL handlesocket或MySQL5.6 memcached API for InnoDB。


數據之間沒有強關聯,這種情況下用mongo+redis是比較合適的,熱點數據保留在redis里,其他數據md5分散到若干台mongodb. 然後請求分散到不同的mongodb上.
擴展也方便


推薦用redis,它把k-v數據緩存在內存裡面,性能很高,技術成熟穩定好,支持主從同步


http://www.thuir.org/thuirdb/
剛在微博上看到的,非常符合你的需求。

當然,不推薦使用不成熟的技術。


mark


mysql用來存數據,redis用來查詢,純內存操作,速度絕對快!

缺點是硬體投入較大,1億條數據全得存到redis伺服器的內存里,redis里用不上的功能,全部不用。


非常感謝 @Neaton 的回答。之前考慮的是常規的用MC做緩存。對redis雖然想嘗試,但因為不太熟悉,一直沒有在生產環境中使用。在這個量級的情況下,使用redis ,@Neaton 有沒有建議呢?


倒入之後只讀的?用 java 隨便寫一個就可以了吧。index 放在內存,數據放在硬碟。如果訪問有冗餘,加個 cache 就好了。


可以嘗試Mysql+Memcache緩存~理論上可以支持較大負荷的查詢~


使用Redis+Mysql吧,Mysql作磁帶,Redis做前台的查詢,比較合適。穩定,快速。


推薦閱讀:

資料庫的選擇?
SQLite 的讀寫效率很高,有哪些使用其他資料庫的理由?
怎麼看待王津THU的海量事務高速處理系統?
關係型資料庫會在 web 開發中消失嗎?
什麼工具可以把Sqlite里所有的表,導出建表的SQL語句?

TAG:資料庫 | 程序員 | PHP | 程序員面試 | 海量數據處理 |