在使用go操作MySQL的时候,不知道为什么特别的慢,大概插入每条数据需要10ms的时间,如果是1w条数据,那么就需要100s(1m40s),这个速度是不能够接受的。
查了一些资料之后,是我在连接数据库的时候,执行每个SQL语句都连接了一次数据库。所以效率非常低。
理想的办法是创建一个
transaction(事务)
,让事务执行多个SQL语句,最后再commit
或者rollback
,完成SQL语句的执行。
database handle type DB
DB is a database handle representing a pool of zero or more underlying connections
…..
The sql package creates and frees connections automatically
准备建立连接func Open
,返回db handle
函数原型:func Open(driverName, dataSourceName string) (*DB, error)
说明地址:https://golang.org/pkg/database/sql/#Open
官方对这个函数的描述是这样的:
Open opens a database specified by its database driver name and a driver-specific data source name, usually consisting of at least a database name and connection information.
Most users will open a database via a driver-specific connection helper function that returns a *DB. No database drivers are included in the Go standard library. See https://golang.org/s/sqldrivers for a list of third-party drivers.
Open may just validate its arguments without creating a connection to the database. To verify that the data source name is valid, call Ping.
The returned DB is safe for concurrent use by multiple goroutines and maintains its own pool of idle connections. Thus, the Open function should be called just once. It is rarely necessary to close a DB.
也就是说这个函数仅仅是确实了连接数据库的参数是否写正确,并不进行数据库连接。
使用func (*DB) Exec
stmt, err := db.Prepare("insert into") if err != nil { fmt.Println("insert db.Prepare err =", err) } defer stmt.Close() _, err = stmt.Exec(num) if err != nil { fmt.Println("insert stmt.Exec err =", err) }
之前我是用这样的方式连接数据库的,起初也没有觉得有什么问题。
但是后面进行实际操作的时候,觉得非常的慢。
db.Prepare()进行一个预处理声明,然后再用返回的statement去执行。Stmt is a prepared statement
这里每次执行这样的一个操作,都会去连接一次数据库,这样非常消耗时间,效率低下。
开启一个事务func (*DB) Begin
tx, err := db.Begin() tx.Exec("insert into") tx.Commit()
Begin()
db会连接一次数据库,并且开启一个事务。
使用这个tx(事务)
进行一系列的操作,不会去重复连接多次数据库,
完成一系列的连接之后,再Commit提交
该事务。这样会大大节省连接数据库的时间。
参考链接
Golang连接MySQL各种方式效率分析:http://studygolang.com/articles/3022