Mongodb 与 MySQL对比

在数据库存放的数据中,有一种特殊的键值叫作主键,它用于唯一地标识表中的某一条记录。也就是说,一个表不能有多个主键,而且主键不能为空值。不管是MongoDB仍是MySQL,都存在着主键的定义。
对于MongoDB来讲,其主键名叫”_id”,在生成数据的时候,若是用户不主动为其分配一个主键的话,MongoDB会自动为其生成一个随机分配的值。数据库

在MySQL中,主键的指定是在MySQL插入数据时指明PRIMARY KEY来定义的。当没有指定主键的时候,另外一种工具 —— 索引,至关于替代了主键的功能。索引能够为空,也能够有重复,另外有一种不容许重复的索引叫唯一索引。若是既没有指定主键也没有指定索引的话,MySQL会自动为数据建立一个。缓存

存储速度对比

1. 数据库的平均插入速率:MongoDB不指定_id插入 > MySQL不指定主键插入 > MySQL指定主键插入 > MongoDB指定_id插入。

2. MongoDB在指定_id与不指定_id插入时速度相差很大,而MySQL的差异却小不少。


分析:

1. 在指定_id或主键时,两种数据库在插入时要对索引值进行处理,并查找数据库中是否存在相同的键值,这会减慢插入的速率。

2. 在MongoDB中,指定索引插入比不指定慢不少,这是由于,MongoDB里每一条数据的_id值都是惟一的。当在不指定_id插入数据的时候,其_id是系统自动计算生成的。MongoDB经过计算机特征值、时间、进程ID与随机数来确保生成的_id是惟一的。而在指定_id插入时,MongoDB每插一条数据,都须要检查此_id可不可用,当数据库中数据条数太多的时候,这一步的查询开销会拖慢整个数据库的插入速度。

3. MongoDB会充分使用系统内存做为缓存,这是一种很是优秀的特性。咱们的测试机的内存有64G,在插入时,MongoDB会尽量地在内存快写不进去数据以后,再将数据持久化保存到硬盘上。这也是在不指定_id插入的时候,MongoDB的效率遥遥领先的缘由。但在指定_id插入时,当数据量一大内存装不下时,MongoDB就须要将磁盘中的信息读取到内存中来查重,这样一来其插入效率反而慢了。

4. MySQL不愧是一种很是稳定的数据库,不管在指定主键仍是在不指定主键插入的状况下,其效率都差不了太多。

插入稳定性分析

插入稳定性是指,随着数据量的增大,每插入必定量数据时的插入速率状况。服务器

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

先呈现四张图上来:
1. MongoDB指定_id插入:运维

图片描述
2. MongoDB不指定_id插入:
图片描述
3. MySQL指定PRIMARY KEY插入:
图片描述分布式

4. MySQL不指定PRIMARY KEY插入:
图片描述工具


总结:

  1. 总体上的插入速度仍是和上一回的统计数据相似:MongoDB不指定_id插入 > MySQL不指定主键插入 > MySQL指定主键插入 > MongoDB指定_id插入。
  2. 从图中能够看出,在指定主键插入数据的时候,MySQL与MongoDB在不一样数据数量级时,每秒插入的数据每隔一段时间就会有一个波动,在图表中显示成为规律的毛刺现象。而在不指定插入数据时,在大多数状况下插入速率都比较平均,但随着数据库中数据的增多,插入的效率在某一时段有瞬间降低,随即又会变稳定。
  3. 总体上来看,MongoDB的速率波动比MySQL的严重,方差变化较大。
  4. MongoDB在指定_id插入时,当插入的数据变多以后,插入效率有明显地降低。在其余三种的插入测试中,从开始到结束,其插入的速率在大多数的时候都固定在一个标准上。

分析:

  1. 毛刺现象是由于,当插入的数据太多的时候,MongoDB须要将内存中的数据写进硬盘,MySQL须要从新分表。这些操做每当数据库中的数据达到必定量级后就会自动进行,所以每隔一段时间就会有一个明显的毛刺。
  2. MongoDB毕竟仍是新生事物,其稳定性没有已应用多年的MySQL优秀。
  3. MongoDB在指定_id插入的时候,其性能的降低仍是很厉害的。
  4. 在读取的数据规模不大时,MongoDB的查询速度真是一骑绝尘,甩开MySQL好远好远。
  5. 在查询的数据量逐渐增多的时候,MySQL的查询速度是稳步降低的,而MongoDB的查询速度却有些起伏。

分析:

  1. 若是MySQL没有通过查询优化的话,其查询速度就不要跟MongoDB比了。MongoDB能够充分利用系统的内存资源,咱们的测试机器内存是64GB的,内存越大MongoDB的查询速度就越快,毕竟磁盘与内存的I/O效率不是一个量级的。
  2. 本次实验的查询的数据也是随机生成的,所以全部待查询的数据都存在MongoDB的内存缓存中的几率是很小的。在查询时,MongoDB须要屡次将内存中的数据与磁盘进行交互以便查找,所以其查询速率取决于其交互的次数。这样就存在这样一种可能性,尽管待查询的数据数目较多,但这段随机生成的数据被MongoDB以较少的次数从磁盘中取出。所以,其查询的平均速度反而更快一些。这样看来,MongoDB的查询速度波动也处在一个合理的范围内。
  3. MySQL的稳定性仍是毋庸置疑的。

结论

  1. 相比较MySQL,MongoDB数据库更适合那些读做业较重的任务模型。MongoDB能充分利用机器的内存资源。若是机器的内存资源丰富的话,MongoDB的查询效率会快不少。
  2. 在带”_id”插入数据的时候,MongoDB的插入效率其实并不高。若是想充分利用MongoDB性能的话,推荐采起不带”_id”的插入方式,而后对相关字段做索引来查询。
  3. MongoDB适合那些对数据库具体数据格式不明确或者数据库数据格式常常变化的需求模型,并且对开发者十分友好。
  4. MongoDB官方就自带一个分布式文件系统,能够很方便地部署到服务器机群上。MongoDB里有一个Shard的概念,就是方便为了服务器分片使用的。每增长一台Shard,MongoDB的插入性能也会以接近倍数的方式增加,磁盘容量也很能够很方便地扩充。
  5. MongoDB还自带了对map-reduce运算框架的支持,这也很方便进行数据的统计。

MongoDB的缺陷

  1. 事务关系支持薄弱。这也是全部NoSQL数据库共同的缺陷,不过NoSQL并非为了事务关系而设计的,具体应用仍是很需求。
  2. 稳定性有些欠缺,这点从上面的测试即可以看出。
  3. MongoDB一方面在方便开发者的同时,另外一方面对运维人员却提出了至关多的要求。业界并无成熟的MongoDB运维经验,MongoDB中数据的存放格式也很随意,等等问题都对运维人员的考验。
相关文章
相关标签/搜索