mongodb性能优化---golang篇

一般来说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接口都是一样的。

你可能感兴趣的:(go语言,mongodb)