为了账号安全,请及时绑定邮箱和手机立即绑定

为什么多个 sql 查询按顺序运行而不是同时运行?

为什么多个 sql 查询按顺序运行而不是同时运行?

Go
慕虎7371278 2023-06-19 16:07:22
我同时在单独的 go 例程中运行 mysql “select” 查询。然而,mysql 服务似乎收集这些查询,按顺序(不是同时)运行它们,然后同时返回所有结果集,并且只有在所有查询都运行之后。我的问题是:1. 为什么这些查询按顺序运行而不是同时运行?2. 为什么 mysql 等到所有查询都运行后再同时返回每个查询的结果集(即使每个结果集属于不同的 go routine 并且据说也使用单独的连接)?另一件事:当我设置“SetMaxOpenConns(2)”时,它会同时返回两个结果集。如果设置为 3,则同时返回 3 个结果集。但是它们仍然总是按顺序运行。有人知道这里发生了什么吗?package mainimport (    "database/sql"    "fmt"    "sync"    "time"    _ "github.com/go-sql-driver/mysql")var database *sql.DBfunc init() {    var err error    databaseURI := "root:toor@tcp(192.168.200.10:3306)/ahc"    database, err = sql.Open("mysql", databaseURI)    if err != nil {        fmt.Println(err)    } else {        fmt.Println("DB Connection Established")        //database.SetMaxIdleConns(0)        //database.SetMaxOpenConns(2)    }}func test(device string, wg *sync.WaitGroup) {    fmt.Println("Thread: " + device + " started")    start := time.Now()    var count string    //using go-sql-driver    sqlStatement, err := database.Prepare("select count(cpeName) from report where errMessage <> \"ok\" and cpeName = ? and jobID = ?")    if err != nil {        fmt.Println(err)    }    defer sqlStatement.Close()    err = sqlStatement.QueryRow(device, "11534").Scan(&count)    sqlStatement.Close()    duration := time.Since(start)    fmt.Println("Thread: " + device + " Duration: " + duration.String() + "\n")    wg.Done()}func main() {    var wg sync.WaitGroup    var deviceList = []string{"xx-swrk-ca-gen-s-002", "xx-leus-ca-ust-ap-068", "xx-sgvn-ca-lug-ap-004", "xx-swrk-ca-vez-s-005", "xx-swrk-ca-vez-ap-006",    "xx-leus-ca-ust-ap-065", "xx-leus-ca-ust-ap-073", "xx-leus-ca-ust-ap-076", "xx-leus-ca-ust-ap-077", "xx-swrk-ca-gen-s-001"}    total := time.Now()    for _, device := range deviceList {        wg.Add(1)        go test(device, &wg)    }    wg.Wait()    duration := time.Since(total)    fmt.Println("\n\nTotal: Duration: " + duration.String() + "\n")}
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

一种查看它们是并行运行还是串行运行的简单技术:让每个连接都执行

SELECT SLEEP(1);

如果是并行的,设置不会超过 1 秒。如果连续,则 N 秒。

如果它们按顺序运行,但在全部完成之前没有输出,那将是一个 GO 问题。

如果您的 7.3 真的是并行的而 9.5 是串行的,那么这就指出了为什么并行运行事物是不值得的——它们会相互踩踏并且完成得不会更快。冲突可能是 CPU 或 I/O 或互斥体或网络或其他东西;这取决于查询。(我的sleep测试是非侵入性的,但需要可预测的时间。)


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信