zoukankan      html  css  js  c++  java
  • golang SQLite3性能测试

    SQLite是个小型的数据库,很简洁,即支持文件也支持内存,比较适合小型的独立项目,在没有网络的时候做一些复杂的关系数据存储和运算。

    为了考察性能做10M(1000万)条记录的测试,测试机4CPU、8G内存,操作系统:Ubuntu 16

    测试结果:

    10M条写入时间:92秒

    平均每条检索时间:0.0172毫秒

    最大内存占用1.7G

    使用的Driver

    github.com/mattn/go-sqlite3

    下面是测试的代码

    //SQLite in memory,小心,不能只写:memory:,这样每一次连接都会申请内存
        db, err := sql.Open("sqlite3", "file::memory:?mode=memory&cache=shared&loc=auto")
        if err != nil {
            fmt.Println("SQLite:", err)
        }
        defer db.Close()
        fmt.Println("SQLite start")
        //创建表//delete from BC;,SQLite字段类型比较少,bool型可以用INTEGER,字符串用TEXT
        sqlStmt := `create table BC (b_code text not null primary key, c_code text not null, code_type INTEGER, is_new INTEGER);`
        _, err = db.Exec(sqlStmt)
        if err != nil {
            fmt.Println("create table error->%q: %s
    ", err, sqlStmt)
            return
        }
        //创建索引,有索引和没索引性能差别巨大,根本就不是一个量级,有兴趣的可以去掉试试
        _, err = db.Exec("CREATE INDEX inx_c_code ON BC(c_code);")
        if err != nil {
            fmt.Println("create index error->%q: %s
    ", err, sqlStmt)
            return
        }
        //写入10M条记录
        start := time.Now().Unix()
        tx, err := db.Begin()
        if err != nil {
            fmt.Println("%q", err)
        }
        stmt, err := tx.Prepare("insert into BC(b_code, c_code, code_type, is_new ) values(?,?,?,?)")
        if err != nil {
            fmt.Println("insert err %q", err)
        }
        defer stmt.Close()
        var m int = 1000 * 1000
        var total int = 10 * m
        for i := 0; i < total; i++ {
            _, err = stmt.Exec(fmt.Sprintf("B%024d", i), fmt.Sprintf("C%024d", i), 0, 1)
            if err != nil {
                fmt.Println("%q", err)
            }
        }
        tx.Commit()
        insertEnd := time.Now().Unix()
        //随机检索10M次
        var count int64 = 0
    
        stmt, err = db.Prepare("select b_code, c_code, code_type, is_new from BC where c_code = ? ")
        if err != nil {
            fmt.Println("select err %q", err)
        }
        defer stmt.Close()
        bc := new(BCCode)
        for i := 0; i < total; i++ {
    
            err = stmt.QueryRow(fmt.Sprintf("C%024d", i)).Scan(&bc.B_Code, &bc.C_Code, &bc.CodeType, &bc.IsNew)
            if err != nil {
                fmt.Println("query err %q", err)
            }
            //屏幕输出会花掉好多时间啊,计算耗时的时候还是关掉比较好
            //fmt.Println("BCode=", bc.B_Code, "	CCode=", bc.C_Code, "	CodeType=", bc.CodeType, "	IsNew=", bc.IsNew)
            count++
        }
        readEnd := time.Now().Unix()
        fmt.Println("insert span=", (insertEnd - start),
            "read span=", (readEnd - insertEnd),
            "avg read=", float64(readEnd-insertEnd)*1000/float64(count))
  • 相关阅读:
    Tomcat gzip果然强大,js文件压缩率50%以上
    URAL 1748
    URAL 1698
    [置顶] Spring中自定义属性编辑器
    Java-类库:lombok
    专业词汇:日志(log)
    SpringBoot-application:application.yml/配置文件详解
    SpringBoot:目录
    Java-Maven-pom.xml-porject-parent:parent
    Java-Maven-pom.xml-project-packaging:packaging(war/jar)
  • 原文地址:https://www.cnblogs.com/liughost/p/6698205.html
Copyright © 2011-2022 走看看