【发布时间】:2017-12-23 15:31:22
【问题描述】:
我正在 Windows 7 Pro 64 位上运行一些测试
它有 i7-6700 和 8GB 内存
我正在从 SSD 访问文件并通过 Java 控制台应用程序处理它们,该应用程序将它们转换并加载到同一台机器上的 mySQL 服务器中,但在单独的机械 HDD 上。
我已禁用页面归档
我已将 innodb_buffer_pool_size 从 8M 设置为 2G
我已将 innodb_thread_concurrency 从 17 设置为 32
我已将 innodb_buffer_pool_instances 从 8 设置为 16
我已将 max_connections 从 151 设置为 256
无论出于何种原因,任何高于此的值都会导致服务器在启动时崩溃。我检查了安装,MySQL 报告说它是 AMD64 安装,但我遇到的内存限制让我怀疑它是否真的是 32 位安装。
我对这个对象特别有问题,下面的结构
CustomObject1
字符串 custObj1str1
字符串 custObj1str2
字符串 custObj1str3
字符串 custObj1str4
int custObj1int1
int custObj1int2
浮动[7] custObj1fltArr1
浮动[7] custObj1fltArr2
ArrayList custObj2
CustomObject2
int custObj2int1
浮动[4] custObj2fltArr1
我从 custObj1str1、custObj1str2、custObj1str3、custObj1str4、custObj1int1、custObj1int2 为 custObj1 创建了一个 HashKey,并将其用作主键。该对象进入 4 个单独的表。
table1
int hashkey(主键)
varchar custObj1str1
varchar custObj1str2
varchar custObj1str3
varchar custObj1str4
int custObj1int1
int custObj1int2
table2
int hashkey(主键)
浮动 custObj1fltArr1[0] ... 浮动 custObj1fltArr1[6]
table3
int hashkey(主键)
浮动 custObj1fltArr2[0] ... 浮动 custObj1fltArr2[6]
table4
int hashkey(主键,第 1 点)
int custObj2int1(主键,第 2 点)
浮动 custObj1fltArr2[0] ... 浮动 custObj2fltArr1[4]
在 Java 中,我正在使用批处理执行准备好的 SQL 语句
对于 table1 -> "INSERT INTO table1 VALUES (?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE " + primaryKey + " = " + primaryKey
For table4 -> "INSERT INTO table4 VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE " + primaryKey + " = " + primaryKey + " AND " + foreignKey + "=" + foreignKey
我相信对于 table4 它会导致一些数据被覆盖,因为它的数据太多(超过 30M 记录)。
这只是一天的数据,我可能需要管理 4 年的数据。
Image of Table Status (sensitive info redacted)
任何建议将不胜感激。
** 更新 **
我尝试在我的 MacBook Pro(2013 年末,配备 i7、16GB RAM 和 SSD)上使用 mySQL。它很慢,但仍然比 Windows 机器快得多。
MacBook Metrics
我将批量上传的方法设置为同步,以限制导入同一个表的数据量。我应该在每个数据库的基础上限制它,保持原样,还是完全删除它?我正在使用 8 计数线程池,但我想增加它。
【问题讨论】:
标签: java mysql optimization batch-processing