weixin_42654444
昨夜是今晨的开始
采纳率64.3%
2018-11-22 06:22

亿级数据,mysql插入数据非常缓慢,谁给优化一下,代码如下。

20
 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 数据规模亿级

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • viviliving 回到未来望过去 3年前

    把你的update方式修改成直接采用delete insert两个语句来替换update机制,应该快很多
    orale的pb开发时update机制就是这样,你试试,有结果回复个,一起学习验证

    点赞 评论 复制链接分享
  • a764485926 a764485926 3年前

    我是java的 最近刚做过这个 给你个思路看行不
    先用select id from XX表 where 1=1 and 条件 and id in (5000/10000条数据ID) 查询出存在的数据 这样最多做2W次查询 如果是查询出有结果就更新 没有结果就Insert

    点赞 评论 复制链接分享

相关推荐