我需要一些关于优化 mysql 连接/查询的帮助。老实说,我对数据库主题还很陌生,因此我不知道如何开始优化过程以及如何解释我的 linux 和 windows 机器之间的性能差异。
我有一个连接到数据库的 java 应用程序,检索一些数据(大约 1 000 000 行),处理它们并写出到一组 csv 文件。 我遇到的问题是,在我的 linux 机器(i5-2520M 和 SSD)上,整个过程大约需要 17 秒,而在我的 Windows 8 计算机(i7-4790k,SSD 磁盘与 7200 rpm HDD 相结合)上,执行几乎需要一分钟相同的代码。
因此它在 win 上的运行时间是 linux 的 3 倍多。 谁能解释为什么会这样以及如何使两个平台上的性能具有可比性?
更新 1:
我猜 JVM 是一个热点版本 8。
数据库在本地主机上。
核心:Windows 为 4x4,5 ghz,Linux 为 2x2,5 ghz,两者均采用英特尔超线程技术
在 linux 或 windows 上都没有捕获到任何异常,即使我已经为它们准备了一个 try/catch。
这里有一些关于应用程序性能和关键组件的基本数据。如有必要,我可以提供更多详细信息,请告诉我您需要什么。
public class DBAccesor {
private Connection mySQLconnection;
private ResultSet answerDB;
private Statement query;
private final String connectionFlags = "&characterEncoding=utf8&useUnicode=true&useSSL=false"
private String queryBody = "SELECT name, surename FROM table1 INNER JOIN table2 ON table1.person_id = table2.person_id WHERE origin = \"eu\"";
...
连接建立于:Win 0.167s vs Linux 0.311s
Class.forName(driverJDBC); DriverManager.setLogWriter(new PrintWriter(System.out)); mySQLconnection = DriverManager.getConnection( DBServer + DBName + login + password + connectionFlags);
查询执行:Win 0.023 秒,Linux 0.01 秒
query = mySQLconnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); query.setFetchSize(Integer.MIN_VALUE); answerDB = query.executeQuery(queryBody);
从结果集中检索数据:Win 53.020s vs Linux 13.282s
ArrayList<Person> results = new ArrayList<Person>(); while (answerDB.next()) { try { String name = new String (answerDB.getBytes(1), "UTF-8"); //since //there is a lot of local characters in my data I have to use //getBytes instead of getString. otherwise obtained characters are //corrupted. String surname = new String (answerDB.getBytes(2), "UTF-8"); results.add (new Person(name, surename)); } catch (SQLException | UnsupportedEncodingException e) { e.printStackTrace(); } }
其余代码非常简单。我有一些 paralelStream
处理基于刚刚创建的 Arraylist
并将输出写入文件。
- 数据处理:Win 1.109s vs Linux 2.976s
- 将输出写入文件:Win 1.571s vs Linux 0.439s
整体运行时间:Win 55.880s vs Linux 17.083s
最佳答案
您要做的是从 MySQL 数据库中检索数据并将这些数据写入您的磁盘。现在的问题是,这与您使用的操作系统无关。查看您的两台机器的配置,我看到您在 Linux 机器上使用 SSD,在 Windows 机器上使用 HDD。您应该知道,SSD 磁盘的读/写能力比 HDD 好得多、快得多,所以我认为这就是性能差异的来源。
我建议您阅读此讨论主题以获取更多信息: https://dba.stackexchange.com/questions/59828/ssd-vs-hdd-for-databases
关于java - JDBC mysql 连接在 Win8 上比 Ubuntu14 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34481671/