我一直在将一个旧的PHP系统重写为Go,希望获得一些性能提升,但是我并没有得到。问题似乎出现在我向Mysql插入数据时。
在PHP中,处理CSV文件、进行哈希处理并将约10k行数据插入MySQL需要40秒(未优化的代码)。
另一方面,仅进行相同的插入10k(空)行数据,去掉任何处理的Go需要110秒。
两个测试都在同一台机器上运行,我使用了go-mysql-driver。
现在看一下Go代码:
这是非常简化的代码,但它仍然需要将近2分钟的时间,而PHP则可以在不到一半的时间内完成。
db := GetDbCon()
defer db.Close()
stmt, _ := db.Prepare("INSERT INTO ticket ( event_id, entry_id, column_headers, column_data, hash, salt ) VALUES ( ?, ?, ?, ?, ?, ? )")
for i := 0; i < 10000; i++{
//CreateTicket(columns, line, storedEvent)
StoreTicket(models.Ticket{int64(0), storedEvent.Id, int64(i),
"", "", "", "", int64(0), int64(0)}, *stmt)
}
//Extra functions
func StoreTicket(ticket models.Ticket, stmt sql.Stmt){
stmt.Exec(ticket.EventId, ticket.EntryId, ticket.ColumnHeaders, ticket.ColumnData, ticket.Hash, ticket.Salt)
}
func GetDbCon() (sql.DB) {
db, _ := sql.Open("mysql", "bla:bla@/bla")
return *db
}
这是我的代码问题,还是go-mysql-driver的问题?或者这很正常,只是PHP在插入记录方面非常快吗?
==编辑==
根据要求,我使用tcpdump记录了PHP和Go的运行情况:
比较这两个日志,我很难得出任何结论,因为它们似乎都在发送相同大小的数据包。但是,对于Go(~110),mysql似乎需要花费近两倍的时间来处理请求,而对于PHP(~44),mysql似乎等待更长时间才会再次发送新请求(不过差异很小)。
insert into ... values (row1), (row2)...
),并通过基准测试找到每个语句最佳的行数。如果插入顺序对你的应用程序没有影响,你也可以使用goroutines并行发出多个语句。 - Tobia