昨夜是今晨的开始 2018-11-22 06:22 采纳率: 100%
浏览 2041
已结题

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

 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条回答 默认 最新

  • a764485926 2018-11-22 08:51
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名