여러 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
'programing' 카테고리의 다른 글
PowerShell: 객체가 아닌 어레이로 결과를 가져오려면 어떻게 해야 합니까? (0) | 2023.07.30 |
---|---|
유튜브 미리 보기에서 검은색 테두리 4:3 제거 (0) | 2023.07.30 |
node.js에 대한 가상 환경이 있습니까? (0) | 2023.07.30 |
조건이 충족되는 경우에만 딕트에 추가 (0) | 2023.07.30 |
특정 속성만을 가진 태그를 찾는 방법 - BeautifulSoup (0) | 2023.07.30 |