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\n", 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\n", 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, "\tCCode=", bc.C_Code, "\tCodeType=", bc.CodeType, "\tIsNew=", 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))

golang SQLite3性能测试的更多相关文章

  1. Golang RPC 性能测试

    Golang RPC 性能测试 | KDF5000 http://kdf5000.com/2017/03/28/Golang-RPC-性能测试/

  2. 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制

    第三期 · 使用 Vue 3.1 + TailWind.CSS + Axios + Golang + Sqlite3 实现简单评论机制 效果图 CommentArea.vue 我们需要借助js的Dat ...

  3. golang 单元测试&&性能测试

    一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必 ...

  4. golang sqlite3 CRUD

    package main import ( "database/sql" "fmt" "log" _ "github.com/ma ...

  5. Golang适合高并发场景的原因分析

    http://blog.csdn.NET/ghj1976/article/details/27996095 典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据 ...

  6. Golang 语言的单元测试和性能测试(也叫 压力测试)

    Golang单元测试对文件名和方法名,参数都有很严格的要求. 例如: 1.文件名必须以xx_test.go命名 2.方法必须是Test[^a-z]开头(T必须大写),func TestXxx (t * ...

  7. golang bufio、ioutil读文件的速度比较(性能测试)和影响因素分析

    前言 golang读取文件的方式主要有4种: 使用File自带的Read方法 使用bufio库的Read方法 使用io/ioutil库的ReadAll() 使用io/ioutil库的ReadFile( ...

  8. golang 性能测试pprof

    golang 性能测试包是位于 net/http 包下的 pprof,其相关介绍可以参看具体的 官方文档 有关 golang 性能测试使用特别简单,在 main 包中的引包位置直接引入: import ...

  9. 基本http服务性能测试(Python vs Golang)

    最近学习Golang,总想体验下并发到底有多叼,必我大 python强势多少. 学习了官方教程的http 服务,用性能测试工具wrk测试了下,发现结果很令人惊讶- wrk可以参考我的博客,有基本用法说 ...

随机推荐

  1. idea,eclipse创建多模块项目

    新建一个maven项目 iead,新建是不选择archetype,新建好之后,pom中的 <packaging>pom</packaging>节点是默认的,如果不是要改成这这样 ...

  2. 质问微软 WP8.1开发HTTPS 真费劲

    本人用C#多年,WPF2年,一直想做点应用为WP生态贡献一点力量,最近终于有机会接触了 家里的本子是2年前的低压I3,不支持虚拟化,一直没有真机.最近同事妈妈换下来一个820给我拿来做开发用,非常感谢 ...

  3. JVM Specification 9th Edition (4) Chapter 4. The class File Format

    Chapter 4. The class File Format Table of Contents 4.1. The ClassFile Structure 4.2. Names 4.2.1. Bi ...

  4. Angular4中的依赖注入

    在Angular中使用依赖注入,可以帮助我们实现松耦合,可以说只有在组件中使用依赖注入才能真正 的实现可重用的组件. 如果我们有个服务product.service.ts,其中export了一个Pro ...

  5. C0304 备份最后一天所有修改的文件

    #! /bin/bash backupfile=backup-$(date +%m-%d-%Y) archive=${1:-$backupfile} # 上边内容, 参数替换 ${} echo $ar ...

  6. 第一百三十九节,JavaScript,封装库--CSS选择器

    JavaScript,封装库--修改元素选择器 就是将构造库函数修改成元素选择器,像css那样,输入#xxx .xxx xxx  (获取指定id下的指定class下的指定标签元素) 修改后的基础库 / ...

  7. 说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用

    说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用 解答:Spring 核心容器(Core)提供Spring框架的基本功能.核心容器的主要组件是BeanFactory,它是工厂模式的 ...

  8. 获取一个Assembly中的命名空间列表

    通过System.Reflection.Assembly类中提供的方法和属性不能直接获取组件中的命名空间列表.但有方法可以直接获得Assembly中的所有类型,我们便可以通过获取的类型来得到命名空间名 ...

  9. 关于TextView的一些初步解说

    Android里面的textview是一个相当重要的类.相信做安卓的开发人员在每一个应用里面都一定用到了它,而且它也是Button,EditTextView等子控件的父类. 对于View的流程:mea ...

  10. PHP 清除HTML代码、空格、回车换行符的函数

    function DeleteHtml($str) { $str = trim($str); $str = strip_tags($str,""); $str = ereg_rep ...