[go] Go 언어에서 데이터베이스의 레코드 조회 속도 개선 예제

본 예제에서는 Go 언어를 사용하여 데이터베이스에서 레코드를 조회하는 과정에서 성능을 개선하는 방법에 대해 알아보겠습니다.

기존 코드 리뷰

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database")
	if err != nil {
		panic(err.Error())
	}
	defer db.Close()

	rows, err := db.Query("SELECT * FROM table")
	if err != nil {
		panic(err.Error())
	}
	defer rows.Close()

	var id int
	var name string
	for rows.Next() {
		err = rows.Scan(&id, &name)
		if err != nil {
			panic(err.Error())
		}
		fmt.Printf("ID: %d, Name: %s\n", id, name)
	}
}

기존의 코드는 database/sql 패키지를 이용하여 MySQL 데이터베이스로부터 레코드를 조회하는 예제입니다.

성능 개선

이제 위의 코드를 개선하여, 데이터베이스 조회 성능을 향상시켜보겠습니다.

Prepared Statement 사용

기존의 방식은 매번 실행될 때마다 동일한 쿼리문을 전달하는 방식이기에 Prepared Statement를 사용하여 미리 컴파일된 상태로 쿼리를 보낼 수 있습니다.

stmt, err := db.Prepare("SELECT * FROM table")
if err != nil {
    panic(err.Error())
}
defer stmt.Close()

rows, err := stmt.Query()
if err != nil {
    panic(err.Error())
}
defer rows.Close()

결과 메모리 최적화

여러 레코드를 가져올 때, 결과를 메모리에 유지하지 않고 필요한 만큼 가져오는 방식을 사용함으로써 메모리 사용량을 최적화할 수 있습니다.

rows, err := stmt.Query()
if err != nil {
    panic(err.Error())
}
defer rows.Close()

var id int
var name string
for rows.Next() {
    err = rows.Scan(&id, &name)
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("ID: %d, Name: %s\n", id, name)
}

결론

위의 개선 방법을 적용함으로써 데이터베이스 조회 성능을 향상시킬 수 있습니다. Prepared Statement를 사용하여 쿼리를 미리 컴파일하는 방식과 필요한 만큼 결과를 가져오는 방식을 사용함으로써 메모리 사용량을 줄일 수 있습니다.

참고문헌: