MongoDB性能测试与Python测试代码
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,最近参与公司一个项目,计划对在线平台的大规模查询做到快速响应,预估数据总量大概在2-3亿条,数据库并发量大概每秒1500,一年后并发大概3000每秒,经过在Redis和mongodb之间艰难的选择之后
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
开原租房软件开发
科目表计算机网络技术
数据库数值字段存字符串
电力监控系统服务器更换验收
ac管理服务器怎样收费
上海综合软件开发制造价格
fanuc数据库
国家网络安全审查办报道
重庆街道党性体检软件开发
百度公司网络安全工资
河源服务器散热片批发商
潍坊学院期末考试数据库原理
江苏参考软件开发活动简介
快速软件开发 微盘
计算机网络技术 怎么学
网络技术应用教我们什么
行业软件开发的三个步骤
动脉网数据库官网
工行软件开发中心视频
工信部网络技术整改通知
top网络安全
网络安全知识竞赛小学
互联网巨头投资科技
retroarch云服务器联机
计算机网络技术基本要求
下载的数据库缺失值
山东公安网络安全设备
linux文件共享服务器
工行软件开发中心视频
大专学校计算机网络技术顶岗实习