【发布时间】:2013-10-24 07:02:30
【问题描述】:
所以我一直在重写一个旧的 PHP 系统来寻找一些性能提升,但我没有得到任何提升。问题似乎出在我正在对 Mysql 进行的插入操作中。
因此,PHP 对 CSV 文件进行一些处理、进行一些散列处理并在 MySQL 中插入大约 10k 行需要 40 秒(未优化的代码)。
另一方面,现在 Go 去掉任何处理,同样插入 10k(空)行需要 110 秒。
两个测试都在同一台机器上运行,我使用的是 go-mysql-driver。
现在是一些 Go 代码:
这是非常简单的代码,与 PHP 相比,这仍然需要将近 2 分钟。
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) 的两倍,Go 似乎在再次发送新请求之前等待稍长一些(尽管差异很小)。
【问题讨论】:
-
同机没问题,但是是同一个数据库和同一个表吗?您是否定义了任何额外的索引?只是一个疯狂的猜测。
-
它们在不同的数据库上运行,命名略有不同(结构相同),但索引完全相同,并且每次测试前都会截断数据库。
-
您使用的是什么 Go 版本和 MySQL 驱动程序?
-
go1.1.2 linux/amd 和来自 github 的最新 go-mysql-driver 文件
-
最后,虽然这不是您问题的答案,但您可能想尝试 Mysql 的多行插入语句 (
insert into ... values (row1), (row2)...),并通过基准找到每个语句的最佳行数。如果插入顺序对您的应用程序无关紧要,您还可以使用 goroutine 并行发出多个语句。