最近跟一个大佬交流的时候提到SQL
查询的问题。
他表达的思路是不用ORM
,用最原始的数据库驱动去查询数据。这样做的收益有两个方面
- 清晰表达
SQL
语义,方便后期优化。特别在报表、数据分析等复杂SQL
撒上。 - 减少无用封装,提升程序性能。
我起初没有什么感触,毕竟ORM
对程序员友好的,用了我会更轻松,但我并不了解具体差异。于是自己做了一个简单的测试,分别使用sqlx
和db.v3
(可能很多人没有听说过这个DB
包,完全是个人喜好)做了性能测试。
准备地区表jz_places
,只有3600条数据
CREATE TABLE `jz_places` (
`placeid` mediumint(8) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`sx` mediumint(8) unsigned NOT NULL DEFAULT '0',
`order` mediumint(8) unsigned NOT NULL DEFAULT '0',
`updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '数据创建时间',
PRIMARY KEY (`placeid`),
KEY `name` (`name`),
KEY `order` (`order`),
KEY `idx_updatetime` (`updatetime`)
) ENGINE=InnoDB AUTO_INCREMENT=49987 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
sqlx代码
func sqlxQuery() error {
db, err := sqlx.Connect("mysql", "root:123456@tcp(127.0.0.1:3306)/mall?charset=utf8")
defer db.Close()
if err != nil {
log.Fatalln(err)
}
var placesList []places
return db.Get(&placesList, "SELECT * FROM jz_places WHERE name like ?", "三环%")
}
func BenchmarkSqlxQuery(b *testing.B) {
b.N = 3000
for i := 0; i < b.N; i++ {
_ = sqlxQuery()
}
}
db.v3代码
func dbQuery() error {
setting := mysql.ConnectionURL{
User: "root",
Password: "123456",
Host: "127.0.0.1",
Database: "mall",
Options: map[string]string{"charset": "utf8"},
}
var placesList []places
db, err := mysql.Open(setting)
defer db.Close()
if err != nil {
log.Fatalln(err)
}
return db.Collection("jz_places").Find("name like ?", "三环%").All(&placesList)
}
func BenchmarkDBQuery(b *testing.B) {
b.N = 3000
for i := 0; i < b.N; i++ {
_ = dbQuery()
}
}
再来看看最终结果
goos: windows
goarch: amd64
pkg: mall/cmd
BenchmarkSqlxQuery-6 3000 2118054 ns/op 8850 B/op 64 allocs/op
PASS
ok mall/cmd 6.695s
Success: Benchmarks passed.
goos: windows
goarch: amd64
pkg: mall/cmd
BenchmarkDBQuery-6 3000 3535622 ns/op 30020 B/op 1054 allocs/op
PASS
ok mall/cmd 10.966s
Success: Benchmarks passed.
每次连接查询到关闭相差1ms左右。我想gorm
与xorm
也会有这样的情况。如果在高性能场景,只用使用SQL
也是不错的选择。
来源:oschina
链接:https://my.oschina.net/lengan/blog/3209998