我一直在测试 Go,希望将它用于新站点,并希望确保它与 PHP 一样快或更快。所以我运行了一个基本测试,在 Go 和 PHP 中进行批量插入,因为我需要批量插入。
我的测试使用事务、准备好的语句、同一台机器、完全相同的表定义、没有索引但 PK 以及函数中的相同逻辑。
结果:
PHP (mysqli) 中的 100k 插入是 4.42 秒
Go(Go-MySQL-Driver)中的 100k 插入是 9.2 秒
我正在使用的 go mysql 驱动程序是在这里找到的最受欢迎的“Go-MySQL-Driver”:https: //github.com/go-sql-driver/mysql
我想知道是否有人可以告诉我我在 go 中的代码是否设置不正确,或者 go 是否就是这样。
这些函数为一些行变量添加了一些可变性,因此每一行都不相同。
去功能:
func fill_table(w http.ResponseWriter, r *http.Request, result_string *string, num_entries_to_add int) {
defer recover_show_error(result_string)
db := getDBConn()
defer db.Close()
var int_a int = 9
var int_b int = 4
var int_01 int = 1
var int_02 int = 1451628000 // Date Entered (2016-1-1, 1am)
var int_03 int = 11
var int_04 int = 0
var int_05 int = 0
var float_01 float32 = 90.0 // Value
var float_02 float32 = 0
var float_03 float32 = 0
var text_01 string = ""
var text_02 string = ""
var text_03 string = ""
start_time := time.Now()
tx, err := db.Begin()
if err != nil {
panic(err)
}
stmt, err := tx.Prepare("INSERT INTO " + TABLE_NAME +
"(`int_a`,`int_b`,`int_01`,`int_02`,`int_03`,`int_04`,`int_05`,`float_01`,`float_02`,`float_03`,`text_01`,`text_02`,`text_03`) " +
"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")
if err != nil {
panic(err)
}
defer stmt.Close()
var flip int = 0
for i := 0; i < num_entries_to_add; i++ {
flip = ((int)(i / 500)) % 2
if flip == 0 {
float_01 += .1 // add to Value
} else {
float_01 -= .1 // sub from Value
}
int_02 += 1 // add a second to date.
_, err = stmt.Exec(int_a, int_b, int_01, int_02, int_03, int_04, int_05, float_01, float_02, float_03, text_01, text_02, text_03)
if err != nil {
panic(err)
}
}
err = tx.Commit()
if err != nil {
panic(err)
}
elapsed := time.Since(start_time)
*result_string += fmt.Sprintf("Fill Table Time = %s</br>\n", elapsed)
}
翻过高山走不出你
相关分类