【发布时间】:2021-11-07 12:37:18
【问题描述】:
我正在对本地 MySQL 实例运行更新查询,更新单行似乎需要大约 8 毫秒。那看起来真的很慢。我可以做些什么来提高性能?
db, _ := sql.Open("mysql", "user:pass@(localhost:3306)/dbname")
db.Exec(`CREATE TABLE topics(
topic_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(250) NOT NULL,
content TEXT,
is_sticky BOOL NOT NULL DEFAULT false,
is_readonly BOOL NOT NULL DEFAULT false,
num_comments INT NOT NULL DEFAULT 0,
num_views INT NOT NULL DEFAULT 0,
activity_at DATETIME DEFAULT CURRENT_TIMESTAMP,
archived_at DATETIME DEFAULT CURRENT_TIMESTAMP,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);`)
db.Exec("INSERT INTO topics(title) VALUES(?);", "Name")
since := time.Now()
for i := 0; i < 100; i++ {
db.Exec("UPDATE topics SET num_views = ? WHERE topic_id = 1;", i)
}
fmt.Println(time.Since(since))
在 Core i7-4790K 上完成 100 次迭代大约需要 850 毫秒。我也用 Postgres 尝试了同样的事情,结果或多或少相同。我创建了这个测试代码,因为我的 web 应用程序非常慢,每个请求大约 10 毫秒(250 个请求/秒的吞吐量),而且结果证明更新需要很长时间。
此外,使用准备好的语句没有任何区别。
stmt, _ := db.Prepare("UPDATE topics SET num_views = ? WHERE topic_id = ?;")
since := time.Now()
for i := 0; i < 100; i++ {
stmt.Exec(i, 1)
}
fmt.Println(time.Since(since))
【问题讨论】:
-
您可以使用单个查询而不是一百个(至少在 PostgreSQL 中,不确定 MySQL 是否也对此提供本机支持,但我认为确实如此)。
-
@mkopriva 是的,我希望单个查询或将它们全部放入事务中会有所帮助,但我的问题是单个更新速度很慢,这导致我的 webapp 的 HTTP 处理程序性能不佳。
-
您的数据库设置出了点问题,或者其他问题,看起来不是 Go 问题:imgur.com/LjHdDtn(postgres,在我的机器上大约 6 毫秒)
-
检查是否有锁阻止更新,但您应该寻找其他方法来保存视图。
-
“我的 web 应用程序非常慢,每个请求大约 10 毫秒” -- @spiky 你没有按照我希望的每个请求执行
sql.Open,还是你?