【发布时间】:2014-04-25 12:37:53
【问题描述】:
我正在尝试了解 MySQL JDBC 驱动程序中的客户端模拟准备语句是如何工作的。
第 1 部分 我在网上读到,对于prepared statements,关系数据库处理JDBC/SQL查询时涉及四个步骤,它们如下:
- 解析传入的 SQL 查询
- 编译 SQL 查询
- 规划/优化数据采集路径
- 执行优化查询/获取并返回数据
步骤的预执行编译 SQL 语句并因此提供预优化。 对于服务器端准备好的语句,将对数据库进行额外的往返以预编译 SQL 语句。
问题 如果客户端模拟准备好的语句不往返数据库,它如何执行第 3 步?还是客户端模拟准备好的语句的工作方式不同?
第 2 部分 我也做了两个实验。
- 实验 1 - 对每个使用一个客户端准备好的语句 查询
- 实验 2 - 为 多次相同的查询
两个实验都显示响应时间等性能有所改善。实验 1 提高了 18% 左右,实验 2 提高了 30% 左右。
问题
- 我是否正确假设预优化仍然存在 客户端准备好的语句?
- 如果是,是否以类似于服务器端的方式进行预优化 (第 1 部分中提到的四个步骤)准备好的语句或在 有什么不同?
- 如果没有,为什么还有改进?
感谢您的帮助!
【问题讨论】:
-
据我所知,您有一个错误的假设,即 MySQL Connector/J 中的客户端准备语句具有性能优势。你真的用普通的
Statement测试过你的第 2 部分吗?您观察到的性能优势很可能源于缓存。 -
嗨,马克,我也用正常的语句测试了第 2 部分。正常的陈述是我实验的基线。事实上,我还用服务器端准备好的语句进行了另外两个实验。如果我重用服务器端准备好的语句,与普通语句相比,性能会有所提高。如果我不重用服务器端准备好的语句,与普通语句相比,性能会下降。对于服务器端,它作为假设工作,因为必须对数据库进行额外的往返。
-
我刚刚检查了缓存preparedstatements的默认设置,对于Connector/J,它设置为false。谢谢马克,你帮了大忙! :)
标签: java mysql jdbc prepared-statement connector-j