3

我试图了解 MySQL JDBC 驱动程序中的客户端仿真准备语句是如何工作的。

Part 1 我在网上看到,对于prepared statements,关系数据库处理JDBC/SQL查询时涉及四个步骤,它们如下:

  1. 解析传入的 SQL 查询
  2. 编译 SQL 查询
  3. 规划/优化数据采集路径
  4. 执行优化查询/获取并返回数据

步骤的预执行编译 SQL 语句并因此提供预优化。对于服务器端准备好的语句,将对数据库进行额外的往返以预编译 SQL 语句。

问题 如果客户端模拟准备好的语句不往返数据库,它如何执行步骤 3?还是客户端仿真准备好的语句的工作方式不同?

Part 2 我也做了两个实验。

  1. 实验 1 - 为每个查询使用一个客户端准备好的语句
  2. 实验 2 - 多次为同一查询“重用”客户端准备好的语句

这两个实验都显示了响应时间等性能的改进。实验 1 提高了约 18%,实验 2 提高了约 30%。

问题

  1. 我是否正确假设客户端准备语句仍然存在预优化?
  2. 如果是,它是否以类似于服务器端(第 1 部分中提到的四个步骤)预处理语句的方式进行预优化,还是以非常不同的方式进行预优化?
  3. 如果没有,为什么还有改善?

谢谢你的帮助!

4

1 回答 1

3

简单的答案:它没有。MySQL 驱动程序 - 默认情况下 - 将简单地执行从参数化查询和(转义)参数值创建的查询字符串。它将通过用转义值替换参数占位符在本地创建此查询,然后将其发送到服务器

请注意,JDBC 并不要求 aPreparedStatement实际上是在服务器端准备的,也不要求它“提高”性能。JDBC 只要求它们工作;如:您可以使用 as 参数占位符指定查询,驱动程序将使用通过方法?设置的值正确执行语句。setXXX

另请注意,MySQL 确实有服务器端准备好的语句,但您需要使用useServerPrepStmts带有 value的连接属性显式启用它true

于 2014-03-19T10:52:19.137 回答