Go 데이터베이스/sql 패키지를 사용하여 실행되는 쿼리는 데이터베이스에 대해 직접 실행되는 동등한 쿼리보다 훨씬 느립니다. . 이러한 불일치를 해결하려면 기본 메커니즘을 자세히 조사하는 것이 중요합니다.
sql.DB 개체는 단일 연결이 아닌 연결 풀을 나타냅니다. sql.Open이 호출되면 풀이 초기화되지만 연결이 설정되지 않을 수 있습니다. 쿼리가 요청될 때만 새 연결이 생성됩니다.
제공된 코드 조각에서 첫 번째 쿼리는 새 연결 생성을 트리거하므로 성능 저하가 발생합니다. 데이터베이스 연결. 두 번째 쿼리 역시 연결 재사용 부족으로 인해 성능 격차가 나타납니다. 각 쿼리는 풀의 기존 유휴 연결을 활용하는 대신 새 연결을 설정합니다.
이 문제를 해결하려면 연결을 풀로 다시 해제하는 것이 중요합니다. 각 쿼리 후에. 이는 쿼리 결과를 나타내는 db.Query의 첫 번째 반환 값을 유지하고 해당 값에 대해 .Close()를 호출하여 수행할 수 있습니다.
풀에서 사용 가능한 연결이 있으면 초기화 후 sql.DB 개체에 대해 Ping을 호출합니다. 이렇게 하면 초기 연결이 강제로 생성됩니다.
준비된 문은 쿼리에 인수가 포함된 경우 활용됩니다. Postgres 프로토콜은 쿼리 문자열에 값을 직접 삽입하는 대신 매개변수를 활성화합니다. 이러한 별도의 매개변수화를 통해 쿼리를 보다 효율적으로 처리할 수 있습니다.
다음 코드 조각은 연결을 올바르게 관리하고 준비된 문을 재사용하는 방법을 보여줍니다.
By 이러한 최적화를 구현하면 쿼리 성능 격차가 크게 줄어들어 직접 쿼리와 비슷한 실행 시간을 제공할 수 있습니다.
위 내용은 Go의 데이터베이스/sql이 직접 데이터베이스 쿼리보다 느린 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!