设为首页 收藏本站
查看: 1197|回复: 0

[经验分享] golang SQLite3性能测试

[复制链接]

尚未签到

发表于 2018-9-19 14:08:24 | 显示全部楼层 |阅读模式
//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))



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-594351-1-1.html 上篇帖子: 搭建Golang开发环境 下篇帖子: Golang 入门系列(一)Go环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表