最近在使用 sqlhooks 进行 sql
执行过程中的错误
指标收集,上线后发现错误数很高,基本和执行成功数一致。为此对 sqlhooks
的 onError
增加了日志,
发现错误:driver: skip fast-path; continue as if unimplemented
。
经过搜索引擎查询后,定位到了这个错误定义在:driver.go
这里对该错误有具体的说明:
1 | ErrSkip may be returned by some optional interfaces' methods to |
大意是:ErrSkip 可以被可选 interface 的方法返回,表面在运行时 fast path 不可用。如果 interface 未实现,sql 包应该继续执行。
SQL 执行经过了 prepare
-> exec
-> close
这三个步骤。
这里已 golang 的 mysql driver
的 query
为例:
sql
package 在执行 query
的时候,会调用对应 driver
实现的 QueryContext
进行执行,mysql
的 QueryContext
会调用 query
方法,该方法的代码如下:
1 | func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) { |
当 SQL 执行的是待有参数的,如:SELECT * FROM foo WHERE id = ?
,会先判断 driver
是否启用了InterpolateParams
,如果没有启用,则会调用 mysql
执行 prepare 逻辑;如果开启,则会在 client 侧进行 prepare
,减少一次 roundtrip
。
因此本人对于 fast path
理解是指是否允许在 client
侧进行 prepare
减少一次对 mysql
的调用。
这里有一段简单的 perf 对比:https://github.com/fatelei/go-benchmark-result/issues/3 。