java - SQL 未使用绑定变量?

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:V3.0.15
  • 【问题描述】:
    java 程序查询tidb, SQL 类似这种,select 1 from t where id = #{param1}, 并且设置了相关参数,
    useServerPrepStmts = true
    cachePrepStmts = true

可是从慢查询日志跟踪,麻烦还是字面值的SQL select 1 from t where id = 1111 ,并没有复用SQL
没有变成select 1 from t where id = ?,请要是哪边有问题?

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

%E5%9B%BE%E7%89%87

指的是 java 应该获取到的是 ?的形式吗。

是的,是java的程序

  1. 请确认下 TiDB 监控 Executor - Queries Using Plan Cache OPS,查询是否用了 prepared plan cache
  2. 查询的表是否是分区表,对于分区表,目前禁用了 prepare plan cache

1、没有使用
2、表没有分区

需要设置 tidb 参数,开启 prepared plan cache
https://docs.pingcap.com/zh/tidb/v4.0/tidb-configuration-file#prepared-plan-cache

生产不建议开启吗? 那java 那边最佳实践为什么有建议调优执行计划缓存呢?

开启 prepared plan cache 只是一种调优手段,参数的开启需要根据实际场景来判断。

如果发现监控中 parse time duration 开销比较严重,则可以考虑开启提高性能。

文档中说的生产不建议,是从技术的角度说明,这个功能的当前状态以及可能的风险。