programing

여러 SQL 쿼리가 동시에 실행되지 않고 순차적으로 실행되는 이유는 무엇입니까?

closeapi 2023. 7. 30. 17:49
반응형

여러 SQL 쿼리가 동시에 실행되지 않고 순차적으로 실행되는 이유는 무엇입니까?

저는 별도의 go 루틴에서 mysql "select" 쿼리를 동시에 실행하고 있습니다.그러나 mysql 서비스는 이러한 쿼리를 수집하여 순차적으로(동시에 실행하지 않음) 실행한 다음 모든 쿼리가 실행된 후에만 모든 결과 집합을 동시에 반환하는 것 같습니다.

제 질문은 다음과 같습니다.
이러한 쿼리가 동시에 실행되지 않고 순차적으로 실행되는 이유는 무엇입니까?
각 쿼리에 대한 결과 집합을 동시에 반환하기 전에 모든 쿼리가 실행될 때까지 mysql이 기다리는 이유는 무엇입니까(각 단일 결과 집합이 다른 go 루틴에 속하고 별도의 연결도 사용함에도 불구하고)?

또 다른 것은 "SetMaxOpenConns(2)"를 설정하면 두 개의 결과 집합이 동시에 반환됩니다.3으로 설정하면 3개의 결과 세트가 동시에 반환됩니다.그러나 항상 순차적으로 실행됩니다.

무슨 일인지 아는 사람?

package main

import (
    "database/sql"
    "fmt"
    "sync"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

var database *sql.DB

func 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")
}

이것이 출력입니다.

DB Connection Established
Thread: xx-leus-ca-ust-ap-068 started
Thread: xx-sgvn-ca-lug-ap-004 started
Thread: xx-leus-ca-ust-ap-065 started
Thread: xx-leus-ca-ust-ap-073 started
Thread: xx-swrk-ca-vez-ap-006 started
Thread: xx-swrk-ca-vez-s-005 started
Thread: xx-leus-ca-ust-ap-076 started
Thread: xx-leus-ca-ust-ap-077 started
Thread: xx-swrk-ca-gen-s-002 started
Thread: xx-swrk-ca-gen-s-001 started
Thread: xx-leus-ca-ust-ap-076 Duration: 7.291656143s

Thread: xx-swrk-ca-gen-s-002 Duration: 7.304134404s

Thread: xx-leus-ca-ust-ap-065 Duration: 7.307958641s

Thread: xx-swrk-ca-vez-s-005 Duration: 7.313591747s

Thread: xx-leus-ca-ust-ap-077 Duration: 7.313992638s

Thread: xx-swrk-ca-vez-ap-006 Duration: 7.314905664s

Thread: xx-swrk-ca-gen-s-001 Duration: 7.320466323s

Thread: xx-leus-ca-ust-ap-073 Duration: 7.322158337s

Thread: xx-leus-ca-ust-ap-068 Duration: 7.324745097s

Thread: xx-sgvn-ca-lug-ap-004 Duration: 7.326001783s



Total: Duration: 7.326096238s

데이터베이스를 사용하는 경우.SetMaxOpenConns(1), 다음은 출력입니다.

DB Connection Established
Thread: xx-leus-ca-ust-ap-068 started
Thread: xx-swrk-ca-gen-s-001 started
Thread: xx-swrk-ca-vez-ap-006 started
Thread: xx-leus-ca-ust-ap-065 started
Thread: xx-leus-ca-ust-ap-073 started
Thread: xx-swrk-ca-gen-s-002 started
Thread: xx-leus-ca-ust-ap-077 started
Thread: xx-sgvn-ca-lug-ap-004 started
Thread: xx-leus-ca-ust-ap-076 started
Thread: xx-swrk-ca-vez-s-005 started
Thread: xx-leus-ca-ust-ap-068 Duration: 1.131790286s

Thread: xx-leus-ca-ust-ap-077 Duration: 2.128919333s

Thread: xx-swrk-ca-gen-s-001 Duration: 3.073559464s

Thread: xx-leus-ca-ust-ap-073 Duration: 4.002964333s

Thread: xx-swrk-ca-vez-s-005 Duration: 4.932256684s

Thread: xx-sgvn-ca-lug-ap-004 Duration: 5.853361245s

Thread: xx-swrk-ca-gen-s-002 Duration: 6.785042625s

Thread: xx-leus-ca-ust-ap-065 Duration: 7.705957815s

Thread: xx-swrk-ca-vez-ap-006 Duration: 8.633000734s

Thread: xx-leus-ca-ust-ap-076 Duration: 9.550948572s



Total: Duration: 9.551103129s

병렬로 실행되는지 직렬로 실행되는지 확인하는 간단한 기술: 각 연결에서

SELECT SLEEP(1);

평행일 경우 세트는 1초 이상 걸리지 않습니다.직렬인 경우 N초입니다.

순차적으로 실행되지만 모두 완료될 때까지 출력이 없으면 GO 문제가 됩니다.

7.3초가 정말 병렬이고 9.5초가 직렬이라면, 이는 병렬로 작동하는 것이 가치가 없는 이유를 나타냅니다. 서로를 밟고 훨씬 더 빨리 끝나지 않습니다.충돌은 CPU, I/O, 뮤텍스, 네트워크 등일 수 있으며 쿼리에 따라 다릅니다.sleep테스트는 매우 비침습적이지만 예측 가능한 시간이 걸립니다.)

언급URL : https://stackoverflow.com/questions/56282604/why-are-multiple-sql-queries-run-in-sequece-and-not-concurrently

반응형