公司目前使用的數(shù)據(jù)庫為MySql,已經(jīng)明顯看到了瓶頸,于是覺得找新的數(shù)據(jù)庫代替,根據(jù)現(xiàn)狀,新的數(shù)據(jù)庫應(yīng)該滿足如下要求:
1.支持Linux(屁話)
2.對python編程友好(總不能因為換個數(shù)據(jù)庫,拉著一群兄弟轉(zhuǎn)java吧)
3.支持集群(又是屁話)
4.能在現(xiàn)有數(shù)據(jù)上輕易建索引,優(yōu)化速度(鬼知道業(yè)務(wù)部門以后會提出個什么鬼需求來呢)
5.最好是C/C++寫的(大部分都是)
去問了一下度娘,NoSQL方面無非就那幾個主流的數(shù)據(jù)庫可以用,大體瀏覽了一下,基本總結(jié)如下:
主流:HBase,Cassandra,Membase,MongoDB,Redis
其中HBase和Cassandra是使用java寫的,直接被pass掉了(支持java的同學(xué)請盡情地噴)
Membase是Erlang和C寫的,對Erlang印象不錯
MongoDB使用C++寫的,存儲格式使用的是BSON,服務(wù)器的接口絕大部分是json格式,還保留了部分的MySql概念(查詢,索引)
Redis使用C/C++,目前公司在用,作為一個輔助功能組件
轉(zhuǎn)一圈下來,決定先試MongoDB,后續(xù)有機會再玩一下Membase。
去前臺轉(zhuǎn)轉(zhuǎn),順來一部被淘汰下來的前臺的PC,配置如下:
Intel(R) Pentium(R) CPU G3250 @ 3.20GHz
2核
4G內(nèi)存
500G硬盤
接下來安裝個Ubuntu 14.04.5 server版進去
計劃先測試一下MySql在這部機器上的性能,再試MongoDB的,這樣有個對比,由于線上數(shù)據(jù)庫服務(wù)器外網(wǎng)無法直接訪問,只能做個搬運工程,把線上的數(shù)據(jù)保存到excel文檔,再在PC機上讀excel寫入到相關(guān)數(shù)據(jù)庫里,這個思路把我惡心了一整天,主要是2點
1.excel一次最多只能寫入7w多條記錄
2.excel讀的效率也使得測試結(jié)果嚴重失真
這時候我心愛的mqtt來救場了
在線上數(shù)據(jù)庫端讀取數(shù)據(jù)放進mqtt里,再在PC端監(jiān)聽對應(yīng)的topic,把數(shù)據(jù)寫入數(shù)據(jù)庫,雖然與真實的性能有點差別,但這個差別是可以接受的。
測試結(jié)果如下:

其中每條數(shù)據(jù)有39個字段,MySql與MongoDB在數(shù)據(jù)插入前都建了2個多字段索引,插入的數(shù)據(jù)是一樣的,數(shù)據(jù)都是逐條插入,使用普通插入模式(沒使用安全插入和表鎖),但MySql使用了UNIQUE KEY,MongoDB目前未做唯一性檢查。
這里明顯看到MongoDB的寫入速度要比Mysql快很多,而且可以預(yù)測,后面隨著數(shù)據(jù)量的增多,MySql的速度衰減會很明顯,但MongoDB在數(shù)據(jù)達到一定規(guī)模后,性能會比較平穩(wěn)。
這里要注意的還有MongoDB運行的時候內(nèi)存的使用情況,MongoDB在運行時會占有大量內(nèi)存,所有正式使用的時候,不適合和業(yè)務(wù)放在同一個服務(wù)器。
這里要說一下數(shù)據(jù)統(tǒng)計,使用相同的統(tǒng)計條件,MySql下初次統(tǒng)計耗時會較大,但再次統(tǒng)計時就會非??欤琈ongoDB的初次統(tǒng)計會比MySql快,但再次統(tǒng)計時,MongoDB還是會耗相同的時長。