我需要一些优化mysql连接/查询的帮助。老实说,我对DB主题还不熟悉,因此我不知道如何启动优化过程以及如何解释我的linux和windows机器之间的性能差异。
我有一个连接到数据库的java应用程序,检索一些数据(大约1 000 000行),处理它们并写出一组csv文件。 我的问题是,在我的linux机器(i5-2520M和SSD)上整个过程大约需要17秒,而在我的Windows 8计算机上(i7-4790k,SSD光盘与7200转硬盘相结合),执行需要将近一分钟相同的代码。
因此,胜利时间比Linux长3倍以上。任何人都可以解释为什么会这样,以及如何在两个平台上提升性能?
更新1:
JVM是我认为版本8的热点。
数据库位于localhost。
核心:用于Windows的4x4,5 ghz和用于linux的2x2,5 ghz都具有英特尔超级线程的花哨东西
即使我已经为所有人准备了一个try / catch,也没有在linux或windows上捕获任何异常。
这里有一些关于应用程序性能和关键组件的基本数据。如有必要,我可以提供更多详细信息,告诉我你需要什么。
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\"";
...
建立连接:赢取 0.167s vs Linux 0.311s
Class.forName(driverJDBC);
DriverManager.setLogWriter(new PrintWriter(System.out));
mySQLconnection = DriverManager.getConnection(
DBServer
+ DBName
+ login
+ password
+ connectionFlags);
查询执行:赢取 0.023s vs Linux 0.01s
query = mySQLconnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
query.setFetchSize(Integer.MIN_VALUE);
answerDB = query.executeQuery(queryBody);
从结果集中检索数据: 赢取 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 55.880s vs Linux 17.083s
答案 0 :(得分:0)
您要做的是从MySQL数据库中检索数据并将此数据写入磁盘。现在的问题是,它与您使用的操作系统无关。看到两台机器的配置,我看到你在Linux上使用SSD而在Windows上使用HDD。您应该知道SSD磁盘的读/写功能比使用HDD更好更快,所以我认为从那里可以看出性能差异来自。
我建议您阅读此讨论主题以获取更多信息: https://dba.stackexchange.com/questions/59828/ssd-vs-hdd-for-databases