>백엔드 개발 >Golang >Go의 데이터베이스/sql이 직접 데이터베이스 쿼리보다 느린 이유는 무엇이며 어떻게 해결할 수 있습니까?

Go의 데이터베이스/sql이 직접 데이터베이스 쿼리보다 느린 이유는 무엇이며 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-17 13:57:02712검색

Why is database/sql in Go Slower Than Direct Database Querying, and How Can I Fix It?

쿼리 성능 차이 조사: 데이터베이스/sql과 직접 쿼리

Go 데이터베이스/sql 패키지를 사용하여 실행되는 쿼리는 데이터베이스에 대해 직접 실행되는 동등한 쿼리보다 훨씬 느립니다. . 이러한 불일치를 해결하려면 기본 메커니즘을 자세히 조사하는 것이 중요합니다.

database/sql의 연결 관리

sql.DB 개체는 단일 연결이 아닌 연결 풀을 나타냅니다. sql.Open이 호출되면 풀이 초기화되지만 연결이 설정되지 않을 수 있습니다. 쿼리가 요청될 때만 새 연결이 생성됩니다.

쿼리 타이밍에 미치는 영향

제공된 코드 조각에서 첫 번째 쿼리는 새 연결 생성을 트리거하므로 성능 저하가 발생합니다. 데이터베이스 연결. 두 번째 쿼리 역시 연결 재사용 부족으로 인해 성능 격차가 나타납니다. 각 쿼리는 풀의 기존 유휴 연결을 활용하는 대신 새 연결을 설정합니다.

풀로 다시 연결 해제

이 문제를 해결하려면 연결을 풀로 다시 해제하는 것이 중요합니다. 각 쿼리 후에. 이는 쿼리 결과를 나타내는 db.Query의 첫 번째 반환 값을 유지하고 해당 값에 대해 .Close()를 호출하여 수행할 수 있습니다.

유휴 연결 설정

풀에서 사용 가능한 연결이 있으면 초기화 후 sql.DB 개체에 대해 Ping을 호출합니다. 이렇게 하면 초기 연결이 강제로 생성됩니다.

준비된 문 및 위치 매개변수

준비된 문은 쿼리에 인수가 포함된 경우 활용됩니다. Postgres 프로토콜은 쿼리 문자열에 값을 직접 삽입하는 대신 매개변수를 활성화합니다. 이러한 별도의 매개변수화를 통해 쿼리를 보다 효율적으로 처리할 수 있습니다.

코드 예

다음 코드 조각은 연결을 올바르게 관리하고 준비된 문을 재사용하는 방법을 보여줍니다.

By 이러한 최적화를 구현하면 쿼리 성능 격차가 크게 줄어들어 직접 쿼리와 비슷한 실행 시간을 제공할 수 있습니다.

위 내용은 Go의 데이터베이스/sql이 직접 데이터베이스 쿼리보다 느린 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.