准备好的声明和声明/查询缓存

我试图理解语句缓存在参数化预准备语句的情况下是否有用。

据我所知

  • 如果我使用缓存,那么查询将根据其“字符串”进行缓存。
  • 在这种情况下,如果查询具有不同的参数值,则它是一个不同的/新的语句/字符串wrt缓存。
  • 此外,当参数更改时,结果也会发生变化。
  • 由于准备好的语句是参数化的,因此在这种情况下使用缓存真的很有用。

我正在使用JDBC / Snaq DB Pool / MySQL数据库。

语句缓存在这里涉及两种不同的情况:

  • JAVA:Snaq DB池提供了ConnectionCache类,它有助于缓存语句。
  • MySQL:DB还提供了缓存查询和结果的方法。 http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

我的困惑很简单:

  • 如果我要在缓存中搜索查询/对应结果,我将根据字符串比较进行搜索。
  • 如果参数值发生变化,查询字符串也会发生变化。
  • 这将导致具有不同参数值的相同查询的高速缓存中的不同条目。

希望我澄清一下我的问题。

语句缓存是关于缓存执行计划

JDBC查询缓存是在数据库方面完成的,它缓存execution plan ,参数的值是无关紧要的,只是它们每次都以相同的顺序。 如果值确实很重要,那么缓存任何东西都没有意义。

很久以前你必须使用PreparedStatements来缓存执行计划,但是从2005年到2008年,所有现代数据库都值得提到缓存执行计划,而不管执行的语句类型如何。

实际的Java Object有一些最小的客户端缓存,它代表PreparedStatementCallableStatement但在现代JDBC驱动程序中,任何实际的时间或空间节省都是最小的。

在服务器端计算execution plan的开销比在客户端进行简单的String操作要大几个数量级。 这意味着在使用PreparedStatement的客户端没有任何有意义的性能优势,还有其他更重要的好处,如SQL Injection保护,以certificate使用它。