compare mongo 3.0.0 rc7 & PostgreSQL 9.3.5 insert use python

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云数据库 MongoDB,通用型 2核4GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:
测试机用的CentOS 6.6 x64 96G内存, 8核, 数据文件放在 OCZ SSD
下载mongo 3.0
# tar -zxvf mongodb-linux-x86_64-3.0.0-rc7.gz
# cd mongodb-linux-x86_64-3.0.0-rc7
# cd bin/

创建数据文件目录
# mkdir -p /data01/mongodb

启动数据库, 参数全部在命令行中
# ./mongod --port 5281 --bind_ip 0.0.0.0 --maxConns 10000 --logpath /tmp/mongo.log --logappend --logRotate reopen --pidfilepath /tmp/mongo.pid --noauth --dbpath /data01/mongodb --fork



2015-02-04T23:23:42.438+0800 I CONTROL  ***** SERVER RESTARTED *****
2015-02-04T23:23:42.470+0800 I CONTROL  [initandlisten] MongoDB starting : pid=627122 port=5281 dbpath=/data01/mongodb 64-bit host=localhost.localdomain
2015-02-04T23:23:42.470+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-02-04T23:23:42.470+0800 I CONTROL  [initandlisten] 
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] db version v3.0.0-rc7
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] git version: e4c60053b2967e16f765fa25d16aa6d629faa196
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] build info: Linux build14.nj1.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] options: { net: { bindIp: "0.0.0.0", maxIncomingConnections: 10000, port: 5281 }, processManagement: { fork: true, pidFilePath: "/tmp/mongo.pid" }, security: { authorization: "disabled" }, storage: { dbPath: "/data01/mongodb" }, systemLog: { destination: "file", logAppend: true, logRotate: "reopen", path: "/tmp/mongo.log" } }
2015-02-04T23:23:42.483+0800 I JOURNAL  [initandlisten] journal dir=/data01/mongodb/journal
2015-02-04T23:23:42.483+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2015-02-04T23:23:42.586+0800 I JOURNAL  [durability] Durability thread started
2015-02-04T23:23:42.587+0800 I JOURNAL  [journal writer] Journal writer thread started
2015-02-04T23:23:42.594+0800 I NETWORK  [initandlisten] waiting for connections on port 5281

下载,安装 pymongo驱动
https://pypi.python.org/pypi/pymongo/
# wget https://pypi.python.org/packages/source/p/pymongo/pymongo-2.8.tar.gz#md5=23100361c9af1904eb2d7722f2658114
# tar -zxvf pymongo-2.8.tar.gz
# cd pymongo-2.8
# python setup.py install

退出pymongo的源码目录
测试
# cd
[root@localhost ~]# python
Python 3.4.2 (default, Jan 27 2015, 00:11:11) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
# 因为我们这里使用的是单节点mongo, 所以使用MongoClient链接即可, 如果用到了master-slave或replica, 最好使用对应的链接接口.
>>> c=pymongo.MongoClient(host='127.0.0.1',port=5281,max_pool_size=1000)
# 创建或连接到一个数据库
>>> db = c.test_database
# 创建或使用一个已有的collection
>>> collection = db.test_collection
# 生成条dict记录
>>> row={'id':1, 'username': 'digoal.zhou', 'age':32, 'email':'digoal@126.com', 'qq':'276732431'}
>>> row
{'age': 32, 'qq': '276732431', 'email': 'digoal@126.com', 'id': 1, 'username': 'digoal.zhou'}
>>> type(row)
<class 'dict'>
# 插入到collection
>>> collection.insert(row)
ObjectId('54d22c8de138238e62bcd73f')
>>> collection
Collection(Database(MongoClient('127.0.0.1', 5281), 'test_database'), 'test_collection')
# 注意再次插入为什么失败呢?
# 原因是insert后row被变更了, 自动添加一个_id, 即mongodb 中唯一标识一个document的值, 必须唯一.
>>> r1=collection.insert(row)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/site-packages/pymongo-2.8-py3.4-linux-x86_64.egg/pymongo/collection.py", line 410, in insert
    _check_write_command_response(results)
  File "/usr/local/lib/python3.4/site-packages/pymongo-2.8-py3.4-linux-x86_64.egg/pymongo/helpers.py", line 202, in _check_write_command_response
    raise DuplicateKeyError(error.get("errmsg"), 11000, error)
pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: test_database.test_collection.$_id_ dup key: { : ObjectId('54d22c8de138238e62bcd73f') }
>>> print(row)
{'age': 32, 'qq': '276732431', 'email': 'digoal@126.com', '_id': ObjectId('54d22d37e138238e62bcd740'), 'id': 1, 'username': 'digoal.zhou'}


测试mongodb插入性能
# vi test.py
import pymongo
import time

# 使用unix socket连接
c=pymongo.MongoClient('/tmp/mongodb-5281.sock')
# c=pymongo.MongoClient(host='127.0.0.1',port=5281,max_pool_size=1000)
db = c.test_database
db.drop_collection('test_collection')
collection = db.test_collection
print(time.time())
print(collection.count())
for i in range(0,1000000):
  collection.insert({'id':1, 'username': 'digoal.zhou', 'age':32, 'email':'digoal@126.com', 'qq':'276732431'})
print(time.time())
print(collection.count())

测试结果 : 
100万条记录, 单线程插入耗时378秒.
# python ./test.py
1423061694.137046
0
1423062072.2314758
1000000

对比测试同一台主机的postgresql插入性能 : 
$ vi test.py
import postgresql
import time

# 使用unix socket连接
conn = { "user": "postgres", 
         "database": "postgres",
         "unix": "/data01/pgdata/pg_root/.s.PGSQL.1921"
}

db = postgresql.open(**conn)
db.execute("drop table if exists tt")
db.execute("create table tt(id int, username name, age int2, email text, qq text)")
ins = db.prepare("insert into tt values($1,$2,$3,$4,$5)")
print(time.time())
print(db.query("select count(1) as a from tt"))
for i in range(0,1000000):
  ins(1,'digoal.zhou',32,'digoal@126.com','276732431')
print(time.time())
print(db.query("select count(1) as a from tt"))

测试结果 :
100万条记录, 单线程插入耗时187秒.
$ python test.py
1423062311.1081557
[(0,)]
1423062498.4938233
[(1000000,)]


测试结果仅供参考.

[参考]
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
23天前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
7天前
|
索引 Python
Python中append,insert和extend的区别
Python中append,insert和extend的区别
|
23天前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库
|
9月前
|
Python
python之列表中常用的函数:append,extend,insert,pop,remove,del函数的定义与使用方法,元素是否在列表中的判断
python之列表中常用的函数:append,extend,insert,pop,remove,del函数的定义与使用方法,元素是否在列表中的判断
101 0
|
SQL 数据库 Python
Python 数据库Insert语句脚本生成工具(SQL Server)
Python 数据库Insert语句脚本生成工具(SQL Server)
335 0
Python 数据库Insert语句脚本生成工具(SQL Server)
|
SQL 关系型数据库 测试技术
Python多进程并发写入PostgreSQL数据表
1、前言      前两天开了两个进程,把Python抓回的数据链接并发写入Mysql中,结果显示出错。后来一查才知道需要自己设置锁,好生麻烦。这时PostgreSQL进入了我的视野,因为这家伙原生就是多进程的,但它是否支持多进程并发写入呢,还需要实际实验一下才知道。
3053 0
|
安全 关系型数据库 API
Python3连接PostgreSQL(10.5)数据库
Python3连接PostgreSQL(10.5)数据库
582 0
Python3连接PostgreSQL(10.5)数据库
|
关系型数据库 PostgreSQL
PostgreSQL sharding : citus 系列7 - topn 加速(count(*) group by order by count(*) desc limit x) (use 估值插件 topn)
标签 PostgreSQL , topn , topn.number_of_counters , count(*) group by order by count(*) desc limit x 背景 count(*) group by order by count(*) desc limit x 用来统计 topn。
1394 0
|
关系型数据库 PostgreSQL
PostgreSQL sharding : citus 系列6 - count(distinct xx) 加速 (use 估值插件 hll|hyperloglog)
标签 PostgreSQL , hll , hyperloglog , distinct , 加速 , citus.count_distinct_error_rate 背景 在分布式数据库中,计算count(distinct xxx),需要对distinct 的字段, 1、去重, 2、重分布去重后的数据,(这一步,如果distinct值特别多,那么就会比较耗时) 3、然后再去重, 4、最后count (xxx), 5、求所有节点的count SUM。
1794 0
|
弹性计算 关系型数据库 测试技术
PostgreSQL 11 tpcc 测试(103万tpmC on ECS) - use sysbench-tpcc by Percona-Lab
标签 PostgreSQL , tpcc 背景 环境 阿里云虚拟机 [root@pg11-test ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: ...
4246 0