Go: go-sql-driver interpolateparams参数优化
这是在做 Golang 项目中的一些实践
性能差异
interpolateparams=false
interpolateparams=true
10261 -> 12117, 18%
带占位符SQL执行流程
prepared -> execute -> close
正常带占位符的sql执行过程:
- 客户端将该语句和参数发给mysql服务器
- mysql服务器编译成一个prepared语句,这个语句可以根据不同的参数多次调用
好处:
- 避免通过引号组装拼接sql语句。避免sql注入带来的安全风险
- 可以多次执行的sql语句
这个参数做了什么?
execute -> close
interpolateparams=true
执行流程: execute -> close
好处:
- 减少了
prepared
网络请求 - 会防止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