1. 程式人生 > >MongoDB資料匯入實驗(mongoimport)

MongoDB資料匯入實驗(mongoimport)

昨天 比較了一下在某個特定應用中MongoDB和MySQL匯入資料的效能,但是MongoDB的測試結果並不能令人滿意,今天繼續嘗試了幾種匯入資料的方法,希望提升資料匯入效能。

在昨天的實驗中,是以id隨機的順序插入資料的,由於我們在id這個屬性上面建立了遞增索引,因此首先懷疑的是由於id無序造成後面插入的資料有可能導致前面已經插入的資料移動位置,所以第一個實驗把插入順序改成按id贈序。但結果沒有什麼變化,插入一百萬條資料用了1422秒(比昨天按id隨機順序插入還慢了點,暈死...)。

進一步懷疑由於昨天的實驗中建立的是unique index,導致每次呼叫update的時候都需要檢查是否有重複索引重複。因此在第二個實驗中去掉了索引unique的限制,改為inventory.create_index([('date',ASCENDING), ('id',ASCENDING)], unique=False, dropDups=False)。但仍然不起作用,插入一百萬條資料還是用了1412秒。

索性把索引全部去掉,插入一百萬條資料仍然用了1419秒。看來不是索引的問題,那麼問題可能來自於一條一條插入資料,改成批量插入是否會好些呢?在後面的實驗中,索引用非unique的形式inventory.create_index([('date',ASCENDING), ('id',ASCENDING)], unique=False, dropDups=False),而資料插入則從昨天呼叫update改為呼叫insert,下面是不同batch size下的測試結果

Batch size Time to insert 1mm records (sec)
1K 1353
4K 1334
16K 1329

結果還是不能令人滿意。結合使用MySQL的經驗,MongoDB是否有一種類似於LOAD DATA INFILE的方法呢?搜了一下發現MongoDB提供了一個數據匯入工具mongoimport ,實驗了一下,先把需要匯入的資料寫入csv,然後用mongoimport匯入,匯入命令如下

mongoimport -d"mydb" -c"inventory" -f"date,id,views" --type=csv --file=data.csv

結果出奇的好,無論csv裡面的id是否有序,匯入一百萬行資料竟然只需要不到40秒!到此匯入實驗可以告一段落了,效能已經完全滿足我們應用的需要了,改天要好好研究一下mongoimport的實現:)