MongoDB不比MySQL快吗?

Eri*_*ric 8 python mysql mongodb

几个月前我发现了mongodb,在看过这篇文章后,我觉得mongodb真的比mysql快,所以我决定建立自己的替补,问题是我的结果与上面帖子的作者不一样,特别是查询数据库:mongodb似乎比MyISAM表慢.你能看看我的python代码,可能是它有什么问题:

from datetime import datetime
import random
import MySQLdb
import pymongo

mysql_db=MySQLdb.connect(user="me",passwd="mypasswd",db="test_kv")
c=mysql_db.cursor()

connection = pymongo.Connection()
mongo_db = connection.test
kvtab = mongo_db.kvtab

nb=1000000
thelist=[]
for i in xrange(nb):
    thelist.append((str(random.random()),str(random.random())))
t1=datetime.now()

for k,v in thelist:
    c.execute("INSERT INTO key_val_tab (k,v) VALUES ('" + k + "','" + v + "')")

dt=datetime.now() - t1
print 'MySQL insert elapse :',dt

t1=datetime.now()
for i in xrange(nb):
    c.execute("select * FROM key_val_tab WHERE k='" + random.choice(thelist)[0] + "'")
    result=c.fetchone()

dt=datetime.now() - t1
print 'MySQL select elapse :',dt


t1=datetime.now()

for k,v in thelist:
    kvtab.insert({"key":k,"value":v})

dt=datetime.now() - t1
print 'Mongodb insert elapse :',dt
kvtab.ensure_index('key')
t1=datetime.now()
for i in xrange(nb):
    result=kvtab.find_one({"key":random.choice(thelist)[0]})

dt=datetime.now() - t1
print 'Mongodb select elapse :',dt
Run Code Online (Sandbox Code Playgroud)

笔记:

  • MySQL和mongodb都在locahost上.
  • MySQL和mongodb都有索引的'key'列

MySQL表:

CREATE TABLE IF NOT EXISTS `key_val_tab` (
  `k` varchar(24) NOT NULL,
  `v` varchar(24) NOT NULL,
  KEY `kindex` (`k`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

版本是:

  • MySQL:5.1.41
  • mongodb:1.8.3
  • python:2.6.5
  • pymongo:2.0.1
  • Linux:Ubuntu 2.6.32 32位PAE
  • 硬件:桌面核心i7 2.93 Ghz

结果(100万次插入/选择):

MySQL insert elapse : 0:02:52.143803
MySQL select elapse : 0:04:43.675914
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was the opposite)
Run Code Online (Sandbox Code Playgroud)

Rem*_*iet 28

叹.这种基准,我在这种情况下使用松散的术语,通常从一开始就分解.MySQL不是一个比MongoDB"慢"的数据库.一个是关系数据库,另一个是NoSQL文档存储.他们将/应该在他们设计涵盖的功能区域中更快.在MySQL(或任何RDBMS)和MongoDB的情况下,这种重叠并不像很多人认为的那么大.与Redis vs. MongoDB讨论相比,它与破碎的苹果和橙子相比.

有许多变量(应用程序功能要求,硬件资源,并发性,配置,可伸缩性等)要考虑任何以"MongoDB比MySQL快"结束的基准或文章,反之亦然,将结果推广到无用点.

如果您想要做基准测试,首先要定义一组严格的功能需求和业务规则,然后在两个持久性解决方案中尽可能高效地实现它们.结果将是一个比另一个更快,并且在几乎所有情况下,更快的方法具有一些相关的缺点,这可能仍然使得较慢的解决方案更可行,这取决于要求.

所有这些都忽略了上述基准测试不能模拟任何现实世界的场景.不会有很多应用程序在没有任何线程/并发性的情况下进行最大吞吐量插入(这会大大影响大多数存储解决方案的性能).

最后,比较像这样的插入也有点破碎.MongoDB可以通过火灾和忘记批量插入实现惊人的插入吞吐量,或者通过fsynced,复制写入可以降低数量级.这里的事情是MongoDB为您提供MySQL不能选择的选择(或者更少).所以这里的比较只能理解业务需求允许火灾和忘记类型写入(归结为"我希望它有效,但如果没有那么没有大事")

TL; DR停止执行简单的吞吐量基准测试.他们几乎总是无用的.

  • +1是一个很好的答案,我只是想补充一点,MySQL提供了大量的存储引擎 - 其中一个是使用分形树来实现出色插入速度的TokuDB. (2认同)
  • 为了充分披露,我想在这里补充一点,我是 MongoDB 的忠实粉丝。但它并不是万能的数据库子弹,10gen 也没有声称它是万能的。 (2认同)

And*_*ich 7

MySQL insert elapse : 0:02:52.143803
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert
Run Code Online (Sandbox Code Playgroud)

Mongodb插入速度要快得多,因为mongodb将所有数据插入ram,然后定期将数据刷新到光盘.

MySQL select elapse : 0:04:43.675914
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was
Run Code Online (Sandbox Code Playgroud)

当您嵌入/非规范化数据时,您可以使用mongodb获得最佳性能.在许多情况下,mongodb允许我们因嵌入/非规范化而避免连接.

当你只是将数据插入一个集合/表并通过索引mongodb读回不应该更快时,如果与sql数据库相比,读取速度应该相同.

BTW:在mongodb 2.0 索引中速度提高了25%,所以我猜2.0将比mysql工作得更快.

  • 插入更快,因为它不像MySQL那样做.safe = true插入有点慢(位通常仍比MySQL快)并且复制写入或fsync写入仍然较慢.重点是,这些比较值得怀疑.他们做了截然不同的事情. (6认同)