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的實現:)