昨天 比较了一下在某个特定应用中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的实现:)