mongodb 查询效率_Python爬取100G级别,2000K以上数据量,用mysql还是mongodb?

这个问题我们可以从两个角度去解答。一个是100G的数据量用MySQL和MongoDB在存读取上有什么区别,另一个是数据本身的结构和你要进行的应用来考虑使用哪种数据库比较方便。

4ad026909161f6776feb1321c51862b6.png

进群:864573496 加入千人交流基地!一起共同学习,资源互享!

100G的数据量

目前来看100G的数据量其实对MySQL和MongoDB在存放都没有什么压力,如果你要经常读取,那么我建议你的MongoDB来做存储。原因在于MongoDB是内存映射模式,可以充分利用系统的内存资源,内存越大MongoDB的查询速度越快,毕竟磁盘与内存的I/O效率不是一个量级的。

如果你对查询的速度要求不高,而且爬下来的数据是结构化数据,你又熟悉MySQL的语法及相关操作,完全可以用MySQL去存这个级别的数据量,就相当于你存储了一个大型Excel表格。

9b375839a886421645c59df5f2374050.png

数据结构

如果数据结构是不一致的,即不会有些行缺失某些字段,有些行又多出一些字段,那么我建议使用MongoDB做存储处理。因为Mongo没有schema的严格定义,是json格式存取。如果爬虫的字段会经常变化,字段定义可能会变更,Mongo对这方面很宽松,很容易兼容。但如果你对事务有要求,最好还是选择MySQL。因为MongoDB这种NoSQL数据库并不是为了事务关系而设计的,具体应用还是看需求。

5e5758e49fd8d45228b5b57dfccd9dc4.png

总而言之,我个人是比较建议使用MongoDB做海量爬虫数据库存储。无论从数据结构的不规整以及数据存读取的速度要求,Mongo都可以胜任,同时MongoDB可以很轻松的横向扩展,分片,复制集群分分钟的事。

不过最终落地还是看需求,还是要从数据存读取频度、量级还有应用场景综合考虑。

每个技术都有自己的应用场景,技术的选择都需要与自己的应用场景结合!

通常来说,千万条以上的数据,mysql数据库的性能会有明显下降,当然可以通过配置主从,或者使用中间件来提高性能。对于mongoDB来说,100G,2000W的数据量应该算是正常,管理上会比mysql简单。但是如果需要较强的事务性、一致性等,mongo可能就不能满足要求。

爬虫爬取下来的数据很多可以直接非结构化的存储,对存储的字段尚未有清晰确定,且因为你的量级很大,不会立马分析,所以建议存储在mongodb 中,以便于进行下一步数据挖掘处理

接下来让小编介绍一下mysq和mongodb的区别

插入稳定性分析

插入稳定性是指,随着数据量的增大,每插入一定量数据时的插入速率情况。

在本次测试中,我们把这个指标的规模定在10w,即显示的数据是在每插入10w条数据时,在这段时间内每秒钟能插入多少条数据。

先呈现四张图上来:

1.MongoDB指定_id插入:

603a13ffdb7ebeb18779b9023813ad93.png

2.MongoDB不指定_id插入:

d87e0f3120811e04f89a148d402b9560.png

3.MySQL指定PRIMARY KEY插入:

f0e10e100d3e92baf18bf18aef23a028.png

4.MySQL不指定PRIMARY KEY插入:

2ae7c09ed200a7be84be22b48907b679.png

分析:

1.如果MySQL没有经过查询优化的话,其查询速度就不要跟MongoDB比了。MongoDB可以充分利用系统的内存资源,我们的测试机器内存是64GB的,内存越大MongoDB的查询速度就越快,毕竟。

2.本次实验的查询的数据也是随机生成的,因此所有待查询的数据都存在MongoDB的内存缓存中的概率是很小的。在查询时,MongoDB需要多次将内存中的数据与磁盘进行交互以便查找,因此其查询速率取决于其交互的次数。这样就存在这样一种可能性,尽管待查询的数据数目较多,但这段随机生成的数据被MongoDB以较少的次数从磁盘中取出。因此,其查询的平均速度反而更快一些。这样看来,MongoDB的查询速度波动也处在一个合理的范围内。

3.MySQL的稳定性还是毋庸置疑的。

在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录。也就是说,一个表不能有多个主键,并且主键不能为空值。

无论是MongoDB还是MySQL,都存在着主键的定义。

对于MongoDB来说,其主键名叫”_id”,在生成数据的时候,如果用户不主动为其分配一个主键的话,MongoDB会自动为其生成一个随机分配的值。

在MySQL中,主键的指定是在MySQL插入数据时指明PRIMARY KEY来定义的。当没有指定主键的时候,另一种工具——索引,相当于替代了主键的功能。索引可以为空,也可以有重复,另外有一种不允许重复的索引叫惟一索引。如果既没有指定主键也没有指定索引的话,MySQL会自动为数据创建一个。

669e02d9c11c9db98119057c2b201526.png

总结:

1.整体上的插入速度还是和上一回的统计数据类似:MongoDB不指定id插入> MySQL不指定主键插入> MySQL指定主键插入> MongoDB指定id插入。

2.从图中可以看出,在指定主键插入数据的时候,MySQL与MongoDB在不同数据数量级时,每秒插入的数据每隔一段时间就会有一个波动,在图表中显示成为规律的毛刺现象。而在不指定插入数据时,在大多数情况下插入速率都比较平均,但随着数据库中数据的增多,插入的效率在某一时段有瞬间下降,随即又会变稳定。

3.整体上来看,MongoDB的速率波动比MySQL的严重,方差变化较大。

4.MongoDB在指定_id插入时,当插入的数据变多之后,插入效率有明显地下降。在其他三种的插入测试中,从开始到结束,其插入的速率在大多数的时候都固定在一个标准上。

91651e3d2aacbdc4ee92fa1f69c5e6e8.png

分析:

1.毛刺现象是因为,当插入的数据太多的时候,MongoDB需要将内存中的数据写进硬盘,MySQL需要重新分表。这些操作每当数据库中的数据达到一定量级后就会自动进行,因此每隔一段时间就会有一个明显的毛刺。

2.MongoDB毕竟还是新生事物,其稳定性没有已应用多年的MySQL优秀。

3.MongoDB在指定_id插入的时候,其性能的下降还是很厉害的。

1.在读取的数据规模不大时,MongoDB的查询速度真是一骑绝尘,甩开MySQL好远好远。

2.在查询的数据量逐渐增多的时候,MySQL的查询速度是稳步下降的,而MongoDB的查询速度却有些起伏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值