这不是关于查询优化的问题。确切地说,是对从MySQL 5.5.27(Amazon RDS)获得的数据传输速率的预期进行合理性检查。
在运行特别繁重的查询时,MySQL Workbench显示的数据传输速率约为1MB / s,查询运行时间约为420秒。这总共增加了大约420M字节的数据传输。
如果将此数据保存到一个简单的文本文件中,则文件的大小最终将小于7M字节。由于ResultSet的元数据,JDBC驱动程序机制等,我当然希望看到一些开销。但是420M与7M的比例对我来说似乎是一个非常糟糕的比率。或者,这正常吗?
任何反馈都非常感谢。非常感谢!
PS。更多详细信息:
-JDBC驱动程序是mysql-connector-java-5.1.13-
数据在Amazon RDS和EC2实例之间传输-Java
1.6 PreparedStatement用于执行查询
Wireshark是一款出色的免费开放源代码(GPL)网络分析工具,可在此类情况下发挥巨大作用。我进行了以下测试,以查看与“正常” MySQL服务器的“典型” JDBC连接可能产生多少流量。
我在jdbctest
测试服务器上创建了一个以MySQL(5.5.29-0ubuntu0.12.04.2)命名的表。
CREATE TABLE `jdbctest` (
`id` int(11) DEFAULT NULL,
`textcol` varchar(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我用100,000行的表格填充了它
id textcol
------ -------
1 ABCDEF
2 ABCDEF
3 ABCDEF
...
100000 ABCDEF
在每个id
值4个字节和每个值6个字节的情况下textcol
,检索所有100,000行应表示1 MB数据量级。
我启动了Wireshark,开始了跟踪,并运行了以下使用mysql-connector-java-5.1.26的Java代码:
import java.sql.*;
public class mysqlTestMain {
static Connection dbConnection = null;
public static void main(String[] args) {
try {
String myConnectionString = "";
myConnectionString =
"jdbc:mysql://192.168.1.3:3306/mytestdb";
dbConnection = DriverManager.getConnection(myConnectionString, "root", "whatever");
PreparedStatement stmt = dbConnection.prepareStatement("SELECT * FROM jdbctest");
ResultSet rs = stmt.executeQuery();
int i = 0;
int j = 0;
String s = "";
while (rs.next()) {
i++;
j = rs.getInt("id");
s = rs.getString("textcol");
}
System.out.println(String.format("Finished reading %d rows.", i));
rs.close();
stmt.close();
dbConnection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
控制台输出确认我已经检索了所有100,000行。
查看Wireshark跟踪的摘要,我发现:
Packets captured: 1811
Avg. packet size: 992.708 bytes
Bytes: 1797795
按方向细分是
packets bytes
------- -----
from me to server 636 36519
from server to me 1175 1761276
因此看来,要检索约1 MB的数据,我从MySQL服务器收到了1.72 MB的总网络流量。下载的约72%的开销(或包括双向流量在内的约76%)当然远不及您的(费率*时间)计算所建议的约5900%的开销。
我强烈怀疑MySQL Workbench报告的〜1 MB / s速率不是整个时间的总体平均传输速率。确定特定情况下开销的最佳方法是使用Wireshark之类的工具并自己进行测量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句