由于公司项目原因需要把大量图片导入到mongo中,于是乎用java写了个小脚本,遍历图片文件夹,把所有的图片导入mongo中,图片数量庞大100多万张。最开始单线程跑,跑了一会发现很慢,十多分钟传了几千张,一合计这得跑到猴年马月啊。分析了一下mongo服务器在本地测试环境,网络传输不是问题。那大部分时间应该消耗磁盘IO上了。于是乎启动了8个线程跑,果然速度上去了。后来又考究了下mongo批量传输,无果(哈哈哈,后面再研究)。20分钟全部导入到了mongo。 临近上线,需要把图片全部导入到云服务器上,小脚本又派上了场,但是这次很悲催,比之前单线程还慢。由于云服务器离我们很远,带宽又很小,大部分时间全消耗在网络IO上了。幸得大神提醒看有没有像mysql类似的导入导出功能。一顿百度mongo自带export和import。
mongo导出命令:mongoexport -d images -c fs.files -o /Users/admin/fs.files.json --type json
mongoexport -d images -c fs.chunks -o /Users/admin/fs.chunks.json --type json
mongo导入命令:mongoimport -d images -c fs.chunks --file /Users/admin/fs.chunks.json
mongoimport -d images -c fs.files --file /Users/admin/fs.files.json
10分钟搞定。
推到云上后,获取图片程序慢了很多,一张图片需要3-8秒钟才查出来。这叔可忍婶也忍不了啊。于是乎又陷入找问题中,本来就没用过mongo的人,各种推断。
本地是很快的只有20多毫秒。于是各种推测:
1:云服务器由于带宽慢,所以在本地请求慢。
于是乎使用curl 请求了下服务,发现同样很慢,排除了带宽问题。
2:云服务器上程序和mongo是放在不同服务器上的。服务器之间网络传输慢
云服务器之间也是内网,ping了一下,很快,排除。
3:mongo安装有问题;
对比本地mongo和云服务器上的mongo
1)云服务器上的mongo出于安全考虑加了auth认证,取消掉auth,还是很慢,排除。
2)云服务器上的mongo加了bindip,取消掉,依然很慢。排除。
忽然无解了。度之,没有类似的问题和答案。漫无边际的浏览着,忽然两个字眼入目:索引
发现了新大陆一般,查看本地mongo中是否有索引:db.fs.chunks.getIndexes(); 然后云服务器查询,果然在这藏着呢。对比之后建索引:
db.fs.files.createIndex({"_id":1},{"name":"_id_"})
db.fs.files.createIndex({"filename":1,"uploadDate":1},{"name":"filename_1_uploadDate_1"})
db.fs.chunks.createIndex({"_id":1},{"name":"_id_"});
db.fs.chunks.createIndex({"files_id":1,"n":1},{"name":"files_id_1_n_1","unique":true});
总结:mongo的export和import索引不会随着走,需要自己重新建。