golang sqlx与db.v3性能对比

不打扰是莪最后的温柔 提交于 2020-03-24 10:58:43

3 月,跳不动了?>>>

最近跟一个大佬交流的时候提到SQL查询的问题。

他表达的思路是不用ORM,用最原始的数据库驱动去查询数据。这样做的收益有两个方面

  • 清晰表达SQL语义,方便后期优化。特别在报表、数据分析等复杂SQL撒上。
  • 减少无用封装,提升程序性能。

我起初没有什么感触,毕竟ORM对程序员友好的,用了我会更轻松,但我并不了解具体差异。于是自己做了一个简单的测试,分别使用sqlxdb.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左右。我想gormxorm也会有这样的情况。如果在高性能场景,只用使用SQL也是不错的选择。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!