2014-02-16 37 views
1

這不是關於查詢優化的問題。相反,對MySQL 5.5.27(Amazon RDS)數據傳輸速率的期望值進行完整性檢查。使用PreparedStatement從MySQL數據庫傳輸數據的開銷

當運行特別嚴重的查詢時,MySQL Workbench顯示的數據傳輸速率約爲1MB/s,查詢運行約420秒。這增加了大約420M字節的數據傳輸。

如果將這些數據保存到一個簡單的文本文件中,則文件大小最終會小於7M字節。由於ResultSet的元數據,JDBC驅動機制等原因,我當然期望看到一些開銷。但420M與7M對我來說似乎是一個非常可怕的比例。或者,這是正常的嗎?

任何反饋是非常感謝。 非常感謝!

PS。更多細節:
-the JDBC驅動MySQL的連接器的Java-5.1.13
-the數據亞馬遜RDS和EC2實例
-Java 1.6的PreparedStatement用於執行查詢

+0

你基於時間的假設是沒有根據的。數據傳輸速率不是消耗時間的唯一原因。不要讓MBs在幾秒鐘內完成。 –

回答

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; 

我與表單

id textcol 
------ ------- 
    1 ABCDEF 
    2 ABCDEF 
    3 ABCDEF 
... 
100000 ABCDEF 

在每id值4個字節,每textcol值6個字節的100,000行填充它,檢索所有100,000行應該某處表示1 MB的數量級上數據。

我解僱了Wireshark的,一開始跟蹤,跑它使用MySQL連接器的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我收到1.72數據來自MySQL服務器的總網絡流量的MB。下載(〜76%,包括兩個方向的流量)〜72%的開銷肯定遠不及你的(rate * time)計算所提出的約5900%開銷。

我強烈懷疑MySQL Workbench報告的〜1 MB/s速率並非整個時間內的整體平均傳輸速率。在特定情況下確定開銷的最佳方法是使用Wireshark等工具並自行測量。

+0

夠公平的,你的方法更具說服力。感謝您的關注。看來工作臺的「交通」指標並沒有那麼有用......在一天結束時,它會顯示類似「Traffic 1MB/s」的圖表,並且該圖表以該速率運行(稍有波動)一段時間。但它聽起來像並不意味着傳輸的字節總數=速度*時間。 – user1454926

相關問題