Go: go-sql-driver interpolateparams参数优化

这是在做 Golang 项目中的一些实践

性能差异

interpolateparams=false

interpolateparams=true

10261 -> 12117, 18%

带占位符SQL执行流程

prepared -> execute -> close

正常带占位符的sql执行过程:

  1. 客户端将该语句和参数发给mysql服务器
  2. mysql服务器编译成一个prepared语句,这个语句可以根据不同的参数多次调用

好处:

  1. 避免通过引号组装拼接sql语句。避免sql注入带来的安全风险
  2. 可以多次执行的sql语句

这个参数做了什么?

execute -> close

interpolateparams=true执行流程: execute -> close

好处:

  1. 减少了prepared网络请求
  2. 会防止SQL注入, 在驱动中通过转义特殊字符实现的

源码

    prepared, err := mc.interpolateParams(query, args)
		if err != nil {
			return nil, err
		}
		query = prepared

		如果query替换成功, 直接执行 writeCommandPacketStr, 并且读取返回值, return (rows, err)

mc.interpolateParams中, 对string/[]byte等做了转义, prepared是插值后的sql


golang

350 Words

2021-01-22 12:00 +0800