MongoDB 存储过程的使用以及性能调优方案

虽然MongoDB给了我们很多驱动可以用,但是都没有mongodb的shell来的方便。 就比如说最近需要做的DBRef嵌套类型的数据要做CRUD如果使用mog驱动的话会非常麻烦。 因此我们这里来做个试验,首先给test数据库添加初始化数据添加Server-side script 以及测试

mongo 添加数据

db.people.insert({"_id":"test","phone","233333"}) //输入原始数据


// 数据库修改函数
// update之后返回修改后的数据。
peopleUpdate=function(id,phone){
db.people.update({
"_id":id,
},{$set:{
phone:phone
}});
return db.people.findOne({"_id":id});
}

//添加数据库函数
 db.system.js.insert({"_id":"peopleUpdatePhone","value": peopleUpdate });
 // 修改数据库函数
 db.system.js.update({"_id":"peopleUpdatePhone"},{$set:{"value": peopleUpdate }})
 //执行数据库函数
 db.eval("peopleUpdatePhone('test','23333test')")

测试之后在mongo shell里面是ok的。

golang 调用函数并返回

package main

import (
        "labix.org/v2/mgo"
        "labix.org/v2/mgo/bson"
       )

func main() {
	session, err := mgo.Dial("")
	if err != nil {
	    panic(err)
	}
	defer session.Close()

	session.SetMode(mgo.Monotonic, true)

	db := session.DB("test")
	var result interface{}
	db.Run(bson.M{"eval": "peopleUpdatePhone('test','new test');"},&result)
}

如上面代码所示,就可以执行修改了。 但是要注意锁的问题:eval会产生写入锁。结果你懂得。

性能测试。

我直接测试了调用main函数10000次

  1. eval
    1. 在测试中eval表现不佳,因为会锁库。
    2. 顺便吐槽一下mongodb的锁那真的是相当的大。
    3. 最后测试我每等到结果,甚至有几次修改一次要用4秒钟。(因为之前的锁没打开。)
  2. runCommand
    1. 会快很多很多
    2. 2w次update同一个key的操作大概是3s。

总结

  1. 我用的是MBP MGX82
  2. 虽然性能不是很好(跟MYSql还是差很多)但是以及够支持一般的应用了
  3. 不是MongoDB不暴力,仅仅是因为我不懂而已。

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术点滴

程序异常分析指南

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异常的情况。程序崩溃时最常见的就是程序运行终止,报告Segmentation fault (core...

73730
来自专栏鹅厂少年的奇妙之旅

glibc内存管理那些事儿

图中,0xC0000000开始的最高1G空间是内核地址空间,剩下3G空间是用户态空间。用户态空间从上到下依次为stack栈(向下增长)、mmap(匿名文件映射区...

46870
来自专栏SeanCheney的专栏

《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)多线程多进程多进程队列一些思考总结

我们在前两章提到了线程、进程,还有并发编程。我们在很高的层次,用抽象的名词,讲了如何组织代码,已让其部分并发运行,在多个CPU上或在多台机器上。 本章中,我们会...

61960
来自专栏武军超python专栏

2018年8月29日学习mysql数据库的笔记

今天遇到的新单词: manual n手工的 correspond v符合一致 reject v拒绝 exist  v存在 solid adj固体的 ...

23150
来自专栏PPV课数据科学社区

将Python和R整合进一个数据分析流程

在Python中调用R或在R中调用Python,为什么是“和”而不是“或”? 在互联网中,关于“R Python”的文章,排名前十的搜索结果中只有2篇讨论了一起...

54880
来自专栏高性能服务器开发

经典面试题(一)之服务器内存碎片

年前去过上海掌门集团(做无线wifi万能钥匙的那一家)和百度面试过一次,前者问了linux下gcc的malloc函数如何分配内存的,后者在二面时通过一个链表的数...

1.4K80
来自专栏小狼的世界

PHP手册阅读笔记

学习PHP以来一直希望有时间能够有时间通读PHP手册,最近终于强迫自己划出一些时间,完成了对PHP手册的通读。除了函数参考部分没有每个都看,其他的章节基本上都看...

21740
来自专栏后端技术探索

PHP 使用协同程序实现合作多任务(一)

PHP 5.5 一个比较好的新功能是实现对生成器和协同程序的支持。对于生成器,PHP的文档和各种其他的博客文章已经有了非常详细的讲解。协同程序相对受到的关注就少...

10910
来自专栏猿人谷

进程和线程的区别

进程和线程的区别 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独...

26450
来自专栏Ryan Miao

redis学习之二from github

大概敲了一遍基本命令,熟悉了redis的存储方式。现在开始进一步系统的学习。学习教程目前计划有三个,一个是github上的https://github.com/...

37560

扫码关注云+社区

领取腾讯云代金券