使用go给mysql增加海量数据

3 篇文章 0 订阅

用mysql创建一个数据库 这里创建 test_big 数据库
创建表

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

需要用到的类库
github.com/go-sql-driver/mysql
github.com/satori/go.uuid
直接使用go get xxx即可
大概1000万插入数据需要5分钟左右
代码如下

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"strconv"
	"time"
)

func main() {
	mysql()
}
//结构体
type Job struct {
	db *sql.DB
	ch chan int
	total int
	n int
}


func mysql(){
	db, err := sql.Open("mysql", "root:123456@/test_big?charset=utf8")
	if err != nil {
		fmt.Println("访问数据库出错", err)
		return
	}
	defer db.Close()
	db.SetConnMaxLifetime(time.Second * 500) //设置连接超时500秒
	db.SetMaxOpenConns(100)                 //设置最大连接数

	total := 25000
	gonum:=400
	fmt.Println("====start=====")
	start := time.Now()
	// 测试插入数据库的功能,每次最多同步20个工作协程
	jobChan := make(chan Job, 20)
	go worker(jobChan)
	//统计使用次数
	ch := make(chan int,gonum)
	for n := 0; n < gonum; n++ {
		job:=Job{
			db:db,
			ch:ch,
			total:total,
			n:n,
		}
		jobChan <- job
	}
	ii:=0
	for{
		<-ch
		ii++
		if(ii>=gonum){
			break;
		}
	}

	end := time.Now()
	curr := end.Sub(start)
	fmt.Println("run time:", curr)
}

func worker(jobChan <-chan Job) {
	for job := range jobChan {
		go sqlExec(job)
	}
}

func sqlExec(job Job)  {
	buf:=make([]byte,0,job.total)
	buf=append(buf," insert into student(user_name) values "...)
	for i := 0; i < job.total; i++ {
		myid, _ := uuid.NewV4()
		userName := myid.String()
		if i == job.total-1 {
			buf=append(buf,"('" + userName + "');"...)
		} else {
			buf=append(buf,"('" + userName + "'),"...)
		}
	}
	ss:=string(buf)
	fmt.Println("第" + strconv.Itoa(job.n) + "次插入2.5万条数据!")
	_, err := job.db.Exec(ss)
	checkErr(err)
	fmt.Println("完成---" + strconv.Itoa(job.n) + "次插入2.5万条数据!")
	job.ch<- 1
}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值