社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
一般来说nosql的插入速度会比mysql等关系型数据库的要快些才对,上次用golang实现了可以在mysql中以2W+/s速度的插入小数据。理论上mongodb的插入速度应该会比mysql快。但是经过测试发现,每次往mongodb插入一条数据的话,插入速度只有1600次每秒。测试代码如下:
package main
import (
"fmt"
"log"
"time"
"strconv"
"gopkg.in/mgo.v2"
)
type Person struct {
Name string
Phone string
Id string
}
func main() {
fmt.Println("hello ")
time.Sleep(10 * time.Second)
dialInfo := &mgo.DialInfo{
Addrs: []string{"192.168.127.133"},
Direct: false,
Timeout: time.Second * 1,
Database: "admin",
Source: "admin",
Username: "root",
Password: "root",
PoolLimit: 4096, // Session.SetPoolLimit
}
session, err := mgo.DialWithInfo(dialInfo)
if err != nil {
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
c := session.DB("admin").C("TEST")
/*
Persons := make([]interface{}, 10000)
fmt.Println(time.Now().Unix())
for i := 0; i < 100; i++ {
for j := i * 10000; j < i*10000+10000; j++ {
Persons[j-i*10000] = &Person{"Ale", "+55 53 8116 9639", strconv.Itoa(int(j))}
}
err = c.Insert(Persons[:]...)
if err != nil {
log.Fatal(err)
}
}
*/
fmt.Println(time.Now().Unix())
for i := 0; i < 1000000; i++ {
err = c.Insert(&Person{"Ale", "+55 53 8116 9639", strconv.Itoa(int(i))})
if err != nil {
log.Fatal(err)
}
}
fmt.Println(time.Now().Unix())
}
结果:
hello
1517393214
1517393808
可以看出,逐条插入,mongodb相对于mysql是并没有什么优势。其实客观的说,是因为单个客户端逐条循环单条插入请求给mongodb的复杂压力并不够大。下图为执行过程中的负载机器负载图,可以看出,磁盘和网络的负载并不大:
优化方案:
1、由于mongodb并没有事务一说。当并发写请求的时候,写入速度肯定会比单客户端的快。
2、每次写请求写多条数据,上面代码中注释去掉即可实现。测试发现每次插入1W条小数据,插入100W条数据只需要9s左右。这还是在普通的pc机中测试。
总结:
对于单个客户端来说,逐条插入的速度会比较慢。如果一个mongodb的链接要在业务尖峰时刻顶住压力,那就需要一次插入多条数据。不仅限于golang,使用其他语言的对接mongodb接口都是一样的。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!