MongoDB性能测试与Python测试代码
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,最近参与公司一个项目,计划对在线平台的大规模查询做到快速响应,预估数据总量大概在2-3亿条,数据库并发量大概每秒1500,一年后并发大概3000每秒,经过在Redis和mongodb之间艰难的选择之后
千家信息网最后更新 2026年10月31日MongoDB性能测试与Python测试代码最近参与公司一个项目,计划对在线平台的大规模查询做到快速响应,预估数据总量大概在2-3亿条,数据库并发量大概每秒1500,一年后并发大概3000每秒,经过在Redis和mongodb之间艰难的选择之后,决定使用mongodb,主要看中其平行扩展能力和GridFS上的Map/Reduce。预估项目完成上线后,高峰时段每秒并发查询在1500-3000之间。
其实我个人是比较喜欢Redis的,其并发查询能力和超越memcached的速度都很令人心动,不过其持久化和集群扩展性不太适合业务需要,所以最后还是选择了mongodb。
下面是对mongodb测试的代码和结果。虽然公司用的一水的CentOS,但是由于我是FreeBSD的支持者,所以在FreeBSD和CentOS上都测试了一下结果。
写库程序是网上抄来的,查询程序是自己写的。
写库程序
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
connection = Connection('127.0.0.1', 27017)
db = connection['hawaii']
#时间记录器
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def insert(num):
posts = db.userinfo
for x in range(num):
post = {"_id" : str(x),
"author": str(x)+"Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts.insert(post)
if __name__ == "__main__":
#设定循环500万次
num = 5000000
insert(num)
查询程序
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
import random
connection = Connection('127.0.0.1', 27017)
db = connection['hawaii']
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
#@func_time
def randy():
rand = random.randint(1,5000000)
return rand
@func_time
def mread(num):
find = db.userinfo
for i in range(num):
rand = randy()
#随机数查询
find.find({"author": str(rand)+"Mike"})
if __name__ == "__main__":
#设定循环100万次
num = 1000000
mread(num)
删除程序
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
connection = Connection('127.0.0.1', 27017)
db = connection['hawaii']
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def remove():
posts = db.userinfo
print 'count before remove:',posts.count();
posts.remove({});
print 'count after remove:',posts.count();
if __name__ == "__main__":
remove()
结果集
CentOS插入和删除胜出;FreeBSD发挥了UFS2的优势,读取胜出。由于是作为查询服务器使用,所以读取速度快是个优势,不过我不是领导,我说了不算,最终还是得CentOS。
在测试中,一直使用mongostat监控,从并发数量上,两个系统差不多。还测试了插入并发查询,不过结果差不多,大概并发的相加和都是15000-25000每秒。性能还是很不错的。
不过确实大数据量下插入性能下降比较严重,CentOS测试了5000万数据插入,耗时接近2小时。大概是6300多秒。比起500万数据插入速度,差不多慢了50%。不过查询速度还算差不多。
测试结果供需要者做个参考。
不过,这个测试不是太公平。FreeBSD配置要差一点。
CentOS 16G内存,Xeon5606 两颗8核。Dell品牌机。
FreeBSD 8G内存,Xeon5506 一颗4核。攒的没牌子1U。
如果相同环境下,我觉得还是FreeBSD性能会比较好一点。
其实我个人是比较喜欢Redis的,其并发查询能力和超越memcached的速度都很令人心动,不过其持久化和集群扩展性不太适合业务需要,所以最后还是选择了mongodb。
下面是对mongodb测试的代码和结果。虽然公司用的一水的CentOS,但是由于我是FreeBSD的支持者,所以在FreeBSD和CentOS上都测试了一下结果。
写库程序是网上抄来的,查询程序是自己写的。
写库程序
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
connection = Connection('127.0.0.1', 27017)
db = connection['hawaii']
#时间记录器
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def insert(num):
posts = db.userinfo
for x in range(num):
post = {"_id" : str(x),
"author": str(x)+"Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts.insert(post)
if __name__ == "__main__":
#设定循环500万次
num = 5000000
insert(num)
查询程序
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
import random
connection = Connection('127.0.0.1', 27017)
db = connection['hawaii']
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
#@func_time
def randy():
rand = random.randint(1,5000000)
return rand
@func_time
def mread(num):
find = db.userinfo
for i in range(num):
rand = randy()
#随机数查询
find.find({"author": str(rand)+"Mike"})
if __name__ == "__main__":
#设定循环100万次
num = 1000000
mread(num)
删除程序
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
connection = Connection('127.0.0.1', 27017)
db = connection['hawaii']
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def remove():
posts = db.userinfo
print 'count before remove:',posts.count();
posts.remove({});
print 'count after remove:',posts.count();
if __name__ == "__main__":
remove()
结果集
| 插入500万 | 随机数查询100万 | 删除500万 | CPU占用 | |
| CentOS | 394s | 28s | 224s | 25-30% |
| FreeBSD | 431s | 18s | 278s | 20-22% |
CentOS插入和删除胜出;FreeBSD发挥了UFS2的优势,读取胜出。由于是作为查询服务器使用,所以读取速度快是个优势,不过我不是领导,我说了不算,最终还是得CentOS。
在测试中,一直使用mongostat监控,从并发数量上,两个系统差不多。还测试了插入并发查询,不过结果差不多,大概并发的相加和都是15000-25000每秒。性能还是很不错的。
不过确实大数据量下插入性能下降比较严重,CentOS测试了5000万数据插入,耗时接近2小时。大概是6300多秒。比起500万数据插入速度,差不多慢了50%。不过查询速度还算差不多。
测试结果供需要者做个参考。
不过,这个测试不是太公平。FreeBSD配置要差一点。
CentOS 16G内存,Xeon5606 两颗8核。Dell品牌机。
FreeBSD 8G内存,Xeon5506 一颗4核。攒的没牌子1U。
如果相同环境下,我觉得还是FreeBSD性能会比较好一点。
查询
测试
数据
程序
结果
差不多
还是
速度
性能
之间
优势
公司
内存
能力
随机数
项目
循环
选择
代码
不错
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州淘业互联网络科技
中关村互联网 科技集团
互联网科技官网
A股互联网金融科技公司
互联网科技公司税收优惠
万易互联网科技
迪茉互联网科技
未来的互联网科技
善班互联网科技有限公司
受益于互联网科技的高速发展
互联网和黑科技的看法
互联网科技扶贫时间
东莞新华互联网科技学校
互联网科技创新的路径
济南有互联网科技公司吗
山东星卡互联网科技有限公司官网
珠海东科互联网科技有限公司
悟空问答互联网科技
三亚科技创新互联网基地
高科技和互联网的现代国家
圆梦互联网科技
互联网科技集团
科技赋能互联网健康
移动互联网科技股
想开互联网科技公司怎么样
互联网金融科技公司的优势
21世纪互联网科技成就
保山互联网科技靠谱吗
山东亿川互联网科技有限责任公司
如何强化互联网金融科技