python - pymongo 插入 vs pymysql 插入

标签 python mysql mongodb pymongo pymysql

我正在使用 MongoDb 和 MySQL 的 python 连接器 pymongo 和 pymysql 测试 MongoDb 和 MySQL,特别是插入功能。 pymongo版本是3.4,pymysql是0.7.9,python是3.5

我的代码看起来像 mongo :

    client = MongoClient('localhost', 27017)
    db = client['local']
    collection = db['cqt']            

    for i in range (0,10):
        datas = [ {'a' : 1, 'b':2" }, {'a' : 3, 'b':4" }, ...] # 2000 dicts
        data =  [ bson.son.SON( d ) for d in datas]
        deltaT = time.clock()
        collection.insert_many( data )
        deltaT = time.clock() - deltaT 

对于 mysql :

    connection = pymysql.connect(host='127.0.0.1',
                     user='admin',
                     password='toto',
                     db='cqt',
                     charset='utf8mb4',
                     cursorclass=pymysql.cursors.DictCursor)

    cursor = connection.cursor()
    sqlRequest = """INSERT INTO `cqt`.`myTable` (`a`,`b`) VALUES """


    for data in datas : sql += data.getSQL() + ","  # 2000 rows
    deltaT = time.clock()
    cursor.execute( sql )
    deltaT = time.clock() - deltaT 

数据是简单的字典,有 6 列,包含一个字符串键和一个 int 值。

当绘制 deltaT 变量(插入 2000 个条目所需的时间)时,我惊讶地发现 mongo 比 mysql 慢得多,慢了 10 倍。 insert duration results

我不想在这里进行基准测试,只是为了估计我需要的用例中的数据库性能。然而,从用 java 进行的其他测试或查看 MySQL 和 MongoDB 之间的网络基准测试来看,我使用 python 的结果根本不是我所期望的。 MySQL 和 Mongo 的插入性能应该非常相似,Mongo 的性能甚至更好。

那么,pymongo 连接器速度慢吗? 你知道我的代码或 MongoDB 中是否应该修改一些参数来提高性能吗? 有什么建议可以让 MongoDB 获得更好的性能吗?

最佳答案

实际上,我认为您需要使用像 MongoDB 管理服务这样的工具来收集一些统计信息,然后确定哪个是您的瓶颈。

这是我的建议:

  • 尝试使用多处理并执行并行Python脚本来插入文档。您绝对会获得更好的性能。

    看看这个 example .

  • 为了最大化写入性能,分片是一个好方法。

  • 检查一下您的磁盘 I/O 速度,也许您可​​以尝试 SSD。

查看更多详细信息 write Operation performance .

希望这有帮助。

关于python - pymongo 插入 vs pymysql 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42174493/

相关文章:

python - 如何找到事件的 PyQt 窗口并将其置于最前面

c# - 表格启动后如何更新?

mysql - 向 MySQL 表添加大列(VARCHAR)会对性能产生重大影响吗?

javascript - 删除另一个数组中数组中的第一个元素

mongodb - 关于 MongoDB 模式设计的建议

node.js - meteor 主机上的 meteor 部署错误

python - 为什么 INSERT INTO 失败并显示 'Operand should contain 1 column(s)' ?

Python scikit 学习的 TfidfVectorizer - 最大值为 1.0?

mysql - 有没有办法通过绑定(bind)本地端口来连接MySQL?

mysql - 存储数据库记录的数量是多余的吗?