使用PreparedStatement从MySQL数据库传输数据的开销

时间:2014-02-16 04:33:25

标签: mysql performance jdbc prepared-statement resultset

这不是关于查询优化的问题。相反,对MySQL 5.5.27(Amazon RDS)的数据传输速率的预期进行了一次完整性检查。

当运行特别繁重的查询时,MySQL Workbench显示大约1MB / s的数据传输速率,查询运行大约420秒。这相当于传输了大约420M字节的数据。

如果将此数据保存到简单文本文件中,则文件大小最终小于7M字节。由于ResultSet的元数据,JDBC驱动程序机制等原因,我当然希望看到一些开销。但420M与7M对我来说似乎是一个非常可怕的比例。或者,这是正常的吗?

非常感谢任何反馈。 非常感谢!

PS。更多细节:
-JDF驱动程序是mysql-connector-java-5.1.13
- 数据在Amazon RDS和EC2实例之间传输
-Java 1.6 PreparedStatement用于执行查询

1 个答案:

答案 0 :(得分:1)

Wireshark是一款精彩的免费开源(GPL)网络分析工具,可以在这种情况下发挥很大作用。我运行了以下测试,以查看与“普通”MySQL服务器的“典型”JDBC连接可能产生的流量。

我在测试服务器上的MySQL(5.5.29-0ubuntu0.12.04.2)中创建了一个名为jdbctest的表。

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个字节,每个textcol值为6个字节,检索所有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之​​类的工具并自行测量。