1

我正在尝试从数据库加载一个巨大的数据集。

    func main() {
        db, err := sql.Open("mysql", "root:pass1@tcp(127.0.0.1:3306)/tuts")

        if err != nil {
            log.Print(err.Error())
        }
        defer db.Close()
        results, err := db.Query("SELECT id, name FROM tags")
        if err != nil {
            panic(err.Error()) 
        }

        for results.Next() {
            var tag Tag
            err = results.Scan(&tag.ID, &tag.Name)
            if err != nil {
                panic(err.Error()) 
            }

            log.Printf(tag.Name)
        }
}

程序是否一次将所有记录加载到内存中?或者有没有办法指定提取大小,以便程序一次只加载 n 行?假设数据库中有百万行,我想每次获取 1000 条记录。

4

1 回答 1

0

这适用于单行和数百万行。大多数 SQL 实现在读取时都有批处理的概念。它们根据需要从磁盘加载数据,并根据需要保持 RAM 使用率低/恒定。

例如,如果您选择 1000 行。数据库可能会将前 100 行加载到 RAM。当您调用Next()时,例如当您到达第 50 行时,数据库会抓取另外 100 行(例如第 100 到 201 行)。

于 2019-04-16T10:04:41.230 回答