昨夜是今晨的开始 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 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问