Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自WorkBench客户端的MySQL查询请求比JDBC.executeQuery所需的时间少得多_Java_Mysql_Jdbc - Fatal编程技术网

Java 来自WorkBench客户端的MySQL查询请求比JDBC.executeQuery所需的时间少得多

Java 来自WorkBench客户端的MySQL查询请求比JDBC.executeQuery所需的时间少得多,java,mysql,jdbc,Java,Mysql,Jdbc,我正在使用以下代码: double timeBefore = System.currentTimeMillis(); ResultSet rs = st.executeQuery(sql); double timeAfter = System.currentTimeMillis(); System.out.println(timeAfter - timeBefore); 返回值为9904.0 当我从WorkBench MySQL客户端执行完全相同的查询时: SELECT DISTINCT co

我正在使用以下代码:

double timeBefore = System.currentTimeMillis();
ResultSet rs = st.executeQuery(sql);
double timeAfter = System.currentTimeMillis();
System.out.println(timeAfter - timeBefore);
返回值为
9904.0

当我从WorkBench MySQL客户端执行完全相同的查询时:

SELECT DISTINCT completeAddress FROM DB_M3_Medium.AvailableAddressesV2 where postNr = 2300 ORDER BY completeAddress ASC;
它需要
0.285s

这怎么可能

PS:我用不同的负载大小进行了尝试,Java JDBC的负载大小总是在10秒左右

编辑:

我用与上面相同的查询尝试了
PreparedStatement
,花费了相同的时间,大约少了1秒

我还尝试使用以下代码ping:

String query = "/* ping */ SELECT 1";
double timeBefore = System.currentTimeMillis();
PreparedStatement preparedStatement = DBConnect.getInstance().con.prepareStatement(query);
ResultSet rs = preparedStatement.executeQuery(query);
double timeAfter = System.currentTimeMillis();
System.out.println(timeAfter - timeBefore);
回答是:
1306.0
,这并不完美,但更好

但我仍然不明白它有什么问题

EDIT2:
我已经计算出它所花费的时间与数据库中的数据量有关(而不是我正在检索的有效负载)。在我看来,索引似乎不起作用。但是为什么只有在使用JDBC而不是WorkBench时才会出现问题。

当您使用java编写代码时,您正在创建连接,然后传递查询。该查询在sql server中编译(使用语句时),然后您将得到结果。整个过程需要一些时间。但是,当您在workbench中执行direclty时,您既不是在创建连接,也不是在编译,您只是在运行sql。因此,当您使用java编写代码、创建连接,然后传递查询时,所用的时间更少。该查询在sql server中编译(使用语句时),然后您将得到结果。整个过程需要一些时间。但是当您在workbench中执行direclty时,您既不是创建连接也不是编译,您只是在运行sql。因此所花费的时间更少。需要记住的一点是,JDBC驱动程序是纯Java,因此,您可能会遇到一些早期的JIT编译,这些编译不适用于MySQL工作台。在JDBC驱动程序代码通过JIT之后,您可能会看到类似的性能。对您来说,真正的测试是在那之后再放几次代码,看看会发生什么


您还可以使用
PreparedStatement
,看看这是否有帮助,因为它应该是与MySQL工作台最类似的API,以避免不必要的查询重新编译。

需要记住的一点是,JDBC驱动程序是纯Java,因此,您可能会遇到一些早期的JIT编译,这些编译不适用于MySQL工作台。在JDBC驱动程序代码通过JIT之后,您可能会看到类似的性能。对您来说,真正的测试是在那之后再放几次代码,看看会发生什么


您还可以使用
PreparedStatement
,看看这是否有帮助,因为它应该是与MySQL工作台使用的API最相似的API,以避免不必要的查询重新编译。

正如@SpringLearner在JDBC中建议的那样,每次执行查询并建立新连接时都需要花费一些时间。您可以使用数据源来避免这种开销并提高性能。

正如@SpringLearner在JDBC中建议的那样,每次执行查询并建立新连接时都需要花费一些时间。您可以使用数据源来避免这种开销并提高性能。

java代码是否连接到远程服务器上的db?是的,但正如您所见,执行查询时需要10秒的时间,不包括连接。与有效载荷大小相同是不相关的。事实上,正如其他人在各种答案中指出的那样。这涉及到日常开支。在这两者之间进行ping的时间安排是什么?Java连接和数据库服务器之间的连接速度是多少?Ping时间和每秒比特数将非常有用。10秒是很长的时间。MySQL Connector/J驱动程序默认情况下会获取所有行,也许Workbench只获取显示的页面而不是所有行。java代码是否连接到远程服务器上的db?是的,但正如您所看到的,执行查询时需要10秒的时间,不包括连接。与有效载荷大小相同是不相关的。事实上,正如其他人在各种答案中指出的那样。这涉及到日常开支。在这两者之间进行ping的时间安排是什么?Java连接和数据库服务器之间的连接速度是多少?Ping时间和每秒比特数将非常有用。10秒是很长的时间。MySQL Connector/J驱动程序默认会获取所有行,也许Workbench只获取显示的页面而不是所有行。真的吗我的意思是你想告诉我Java执行查询的速度比WorkBench慢20-40倍是标准行为吗?@OndrejTokar我认为你不会总是慢20-40倍。检查执行时间最合适的方法是System.NanoTimeSevery?:我的意思是你想告诉我Java执行查询的速度比WorkBench慢20-40倍是标准行为吗?@OndrejTokar我认为你不会总是慢20-40倍。检查执行时间最合适的方法是System.nanotimeThank。我尝试了
PreparedStatement
,但没有真正改进任何东西。谢谢。我尝试了
PreparedStatement
但没有真正改进任何东西。