当前位置: 首页 > 知识库问答 >
问题:

如何优化MySQL以适应Java应用程序的大规模批量插入?

姚向晨
2023-03-14

我在Windows 7 Pro 64位上运行一些测试
它有i7-6700和8GB的RAM
我从SSD访问文件,并通过Java控制台应用程序处理它们,该应用程序将它们转换并加载到同一台机器上的mySQL服务器上,但在单独的机械硬盘上。

我已经禁用了页面归档
我已经将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
float[7]custObj1fltArr1
float[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

table2
int hashkey(主键)
浮动custobj1fltarr1[0]...float custobj1fltarr1[6]

table3
int hashkey(主键)
浮动custobj1fltarr2[0]...float custobj1fltarr2[6]

table4
int hashkey(主键,pt 1)
int custObj2int1(主键,pt 2)
浮动custobj1fltarr2[0]...float custobj2fltarr1[4]

在Java中,我正在对准备好的SQL语句进行批处理
table1->“在重复键更新时插入table1值(?,?,?,?,?,?,?,?,?,?,?,?)”+primaryKey+“=”+primaryKey+“=”+primaryKey+“=”+foreignKey
“在重复键更新时插入table4值(?,?,?,?,?,?,?,?)”+primaryKey+“=”+foreignKey
“我认为对于table4来说,这会导致一些数据被覆盖,因为数据太多(超过30m条记录)。

这只是一天的数据,我可能要管理4年的价值。

表状态图像(敏感信息已编辑)
如有任何建议,将不胜感激。


**更新**

我试着在我的MacBook Pro上使用mySQL(2013年底,配有i7、16GB RAM和SSD)。它很慢,但仍然比Windows机器快得多。

MacBook Metrics
我将批量上传的方法设置为同步,以限制导入同一表的数据量。我应该在每个数据库的基础上限制它,保留它,还是完全删除它?我正在使用一个8计数的线程池,但我想增加它。

共有1个答案

宗政法
2023-03-14

该Data_length可疑地接近2^31。mysql驻留在哪个文件系统上?NTFS应该可以,但我怀疑FAT16和FAT32有局限性。(数据库的增长速度比Windoz快。)

让我们看看日志。32位可以解释崩溃(它会在日志中)。如果是32位的,请放弃您提到的4个更改,但是INNODB_BUFFER_POOL_SIZE=1500M。即使64位和崩溃,看看这是否有帮助。

要判断批插入,请提供show CREATE table以及一次批处理多少行。

查看所涉及的文件系统,并查看是否有解决方案。否则...

如果问题是操作系统对文件大小的限制,那么通过MySQL可能会有一个解决方案。

>

  • IBDATA1实际上可以是一组文件,您可以将每个文件限制为1GB。参见手册。如果你找不到,我就把它挖出来。

    一个表可以分区是指每个分区足够小以适应操作系统的限制。这需要INNODB_FILE_PER_TABLE=ON并仔细设计如何进行分区。我需要查看show CREATE table,并了解每列中的值,然后再提出建议。

    5.7允许指定每个分区的位置--如果整个驱动器有限制,这将非常方便。(与每个文件相反。)

  •  类似资料:
    • 问题内容: 我需要通过REST API的Batch端点将大量节点及其之间的关系插入到Neo4j中,大约每秒5k记录(仍在增加)。 这将是24x7连续插入。每条记录可能只需要创建一个节点,而其他记录可能需要两个节点并创建一个关系。 是否可以通过更改程序或修改Neo4j的设置来提高插入件的性能? 到目前为止,我的进度: 1.我已经使用Neo4j进行了一段时间的测试,但无法获得所需的性能 测试服务器盒:

    • 我是一个使用java的Android应用程序开发人员,我开始了解Flutter使用谷歌创建的飞镖语言。我发现它非常有趣,因为它为Android和iOS构建了应用程序。我已经为Android创建了一个简单的TabLayout应用程序,应用程序的大小为27MB,请看看简单的TabLayout Flutter App的屏幕截图。 > 我已经看到Flitter应用程序的大小超过了25MB,那么为什么Fli

    • 问题内容: 我在将不同的缓冲区大小插入到本地SQLite DB中时发现,当缓冲区大小为10,000时,插入10,000,000行数据需要花费近8分钟的时间。换句话说,它需要1,000次写入来存储所有内容。 8分钟存储10,000,000个似乎太长了(或者是?) 可以优化以下任何一项以提高速度吗?请注意,插入的数据是字符的随机集合。 创建表格后,通过 是否可以进一步优化上述任何一项? 问题答案: 我

    • 问题内容: 目前,我在生产中有一个监视器应用程序。该监视器的工作是收集社交网络上的特定条目,如Facebook,Twitter,YouTube等。 这是一个来自Twitter的API调用的简单示例: http://search.twitter.com/search?q=Stackoverflow&format=json 基本上,这就是系统的作用: 给定特定顺序,从数据库中选择搜索词 调用API 从

    • 问题内容: 我必须修改一个dropwizard应用程序以缩短其运行时间。基本上,此应用程序每天接收大约300万个URL,然后下载并解析它们以检测恶意内容。问题在于该应用程序只能处理100万个URL。当我查看该应用程序时,发现它正在进行许多顺序调用。我想对如何通过使其异步或其他技术来改进应用程序提出一些建议。 所需代码如下:- 我在考虑以下方法: 我直接通过调度程序调用,而不是通过POST调用dro

    • 所需代码如下:- 我在考虑以下方法:- > 不是通过POST调用dropwizard资源方法,而是直接从计划程序调用。 谢了。 编辑:我能想到两个瓶颈: 网页下载 将结果插入数据库(数据库位于另一个系统中) 似乎一次执行1个URL的处理