package databasebit
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
//此函数要被调用上亿次,进行数据的插入以及查询 重复数据大概占比50
func Databaseinbit(db *sql.DB, newaddress string, newrece, newsend float32) {
// 查询数据表的address字段内有没有重复数据
rows, err := db.Query("SELECT * FROM bitcoin WHERE address REGEXP '"+newaddress+"'")
checkErr(err)
//如果address数据重复 将rece与send进行更新
for rows.Next() {
//在不报错的情况下 uid可以不提取数据
var uid int
var address string
var rece float32
var send float32
err = rows.Scan(&uid, &address, &rece, &send)
checkErr(err)
//如果地址相同 选择rece或者send进行更新
if address == newaddress {
if newrece != 0 {
rece += newrece
stmt, err := db.Prepare("update bitcoin set rece=? WHERE address='"+newaddress+"'")
checkErr(err)
res, err := stmt.Exec(rece)
checkErr(err)
affect, err := res.RowsAffected()
checkErr(err)
fmt.Println("address:",address," :" , affect)
rows.Close()
return
}
if newsend != 0 {
send += newsend
stmt, err := db.Prepare("update bitcoin set send=? WHERE address='"+newaddress+"'")
checkErr(err)
res, err := stmt.Exec(send)
checkErr(err)
affect, err := res.RowsAffected()
checkErr(err)
fmt.Println("address:",address," : ", affect)
rows.Close()
return
}
}
}
// 如果没有重复数据 将数据插入
stmt, err := db.Prepare("INSERT bitcoin SET address=?,rece=?,send=?")
checkErr(err)
stmt.Exec(newaddress, newrece, newsend)
return
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
这是表的数据结构
当全部数据插入完成后
对数据表中address字段进行查询 查询时间不能超过0.5s 数据规模亿级