· 6 years ago · Aug 31, 2019, 02:02 PM
1package main
2
3import (
4 "bytes"
5 "database/sql"
6 "fmt"
7 _ "github.com/go-sql-driver/mysql"
8 "sync"
9 "time"
10)
11
12/* test #1 */
13
14var (
15 connection = "msandbox:msandbox@tcp(127.0.0.1:8017)/test"
16 threads = 32
17 insertRow = "(NOW(), RANDOM_BYTES(512))"
18 createTable = "CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY auto_increment, b DATETIME NOT NULL, c VARBINARY(512) NOT NULL, INDEX(b))"
19)
20
21/* test #2 */
22/*
23var (
24 connection = "msandbox:msandbox@tcp(127.0.0.1:8017)/test"
25 threads = 32
26 insertRow = "(NOW(), RANDOM_BYTES(512))"
27 createTable = "CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY auto_increment, b DATETIME NOT NULL, c VARBINARY(512) NOT NULL, UNIQUE (c))"
28)
29*/
30
31var (
32 w = new(sync.WaitGroup)
33)
34
35func main() {
36
37 db, err := sql.Open("mysql", connection)
38 if err != nil {
39 fmt.Printf("Could not connect to MySQL: %s.", err)
40 }
41
42 buf := new(bytes.Buffer)
43 for i := 0; i < 100; i++ {
44 buf.WriteString(insertRow)
45 buf.WriteString(",")
46 }
47 batchedInsert := fmt.Sprintf("INSERT INTO t1 (b,c) VALUES %s %s;", buf.String(), insertRow)
48
49 db.Exec("DROP TABLE IF EXISTS t1")
50 db.Exec(createTable)
51 w.Add(1)
52
53 go monitor(db)
54
55 for i := 0; i < threads; i++ {
56 go insertOnLoop(db, batchedInsert)
57 }
58
59 w.Wait()
60
61}
62
63func insertOnLoop(db *sql.DB, sql string) {
64 for {
65 _, err := db.Exec(sql)
66 if err != nil {
67 fmt.Printf("error: %s\n", err)
68 } else {
69 // fmt.Printf(".")
70 }
71 }
72}
73
74func monitor(db *sql.DB) {
75
76 prevcount, newcount := 0, 0
77 var fake string
78 fmt.Printf("Time,Rows\n")
79
80 for i := 0; i <= 3600; i++ {
81
82 rows, err := db.Query("SHOW GLOBAL STATUS LIKE 'Innodb_rows_inserted'")
83 if err != nil {
84 fmt.Printf("could not dump count: %s", err)
85 }
86
87 for rows.Next() {
88 err = rows.Scan(&fake, &newcount)
89 if err != nil {
90 fmt.Printf("could not dump count: %s", err)
91 }
92 }
93
94 if prevcount > 0 {
95 fmt.Printf("%d,%d\n", i, (newcount - prevcount))
96 }
97
98 prevcount = newcount
99 rows.Close()
100 time.Sleep(time.Second)
101 }
102 w.Done()
103
104}