java - 使用Java从Map中的MySQL表中检索百万条记录

标签 java mysql sql dictionary

我有以下问题: 我有一个存储一些文件的应用程序,并且为每个文件在 MySQL 表中创建 2 个条目:文件的路径和一个值 X(可以在文件中找到的唯一标识符)。

相同的唯一标识符值也存储在文件本身中。

现在我编写了一个小程序,因为我们遇到了一些不一致,因为某些文件与数据库表中的路径相同,但文件本身的值 X 不同(文件中的值是正确的)。

我编写了一个 Java 应用程序: 首先读取所有文件(使用 DCM4CHEE 库),将文件路径和值 X 存储在映射对象中(使用路径作为键)。 然后使用查询读取 MySQL 表,将检索到的值(路径 + 值 X)存储在另一个映射中,最后比较 2 个映射并将不一致的记录写入文件。

不幸的是,在某些情况下,我们需要读取超过 2-3 百万个文件(以及 MySQL 表中的记录),这使得检索速度非常慢。 这些文件需要单独读取(因为它们是使用特殊文件格式(DICOM)编写的医疗记录,我需要一个特殊的库来访问内容。

我的问题是: 1 - 在 Java 中使用 Maps 存储超过 300 万条记录是否合适,还是我应该使用不同的对象?有没有更高效的方法?

2 - 为了从 MySQL 检索记录,我启动了一系列限制记录数量的查询(从记录 1 到 x,详细说明结果,然后再次从 x 到 y,详细说明,依此类推(y 到 z ...) 直到所有记录都被读取。我这样做是因为检索所有记录的单个查询需要非常长的时间。 我正在做的事情正确吗?在 Java 中是否有更好的方法来做到这一点?

谢谢大家的帮助。

最佳答案

1 - is using Maps to store over 3 millions records appropriate in Java or shall I use a different Object? Is there something more efficient?

只要进程空间中有足够的可用内存来保存数据,映射就应该没问题。如果每个条目平均为 100 字节(听起来对于路径加 key 来说合适?),则最多需要 300MB。如果每个条目有 500 字节,那么您将看到 1.5GB。

2 - to retrieve the records from MySQL I launch a series of query limited on the number of records (from record 1 to x, elaborate the results, then again from x to y, elaborate, and so on (y to z...) until all records have been read. I do this as a single query to retrieve all records is taking extremely long.

在单个查询中读取所有记录通常不会有问题(尽管如果您使用 ORDER BY,在某些情况下可能会变得相对昂贵)。对于具有适当硬件和适当配置的 MySQL 系统来说,2-300 万条记录根本不算什么。

一些需要检查的事情:

  • 您的 MySQL 服务器配置正确吗?默认配置文件不是一个好的起点。
  • 您是否在属于 WHERE 或 ORDER BY 子句的任何字段上建立了索引?

关于java - 使用Java从Map中的MySQL表中检索百万条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327652/

相关文章:

java - AWS 在 Java 中获取实例名称

java - 为什么我写mvn help :effective-pom in the command prompt?时出现错误 "No plugin found for prefix ' help' in the current project"

java - 如何使用mockito对图节点进行单元测试?

sql - 有什么办法可以加快这个 sql 查询吗?

java - 如何在单个 for 循环中动态更改多个 jLabel 的文本?

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 获取mysql中特定用户的排名

php - 添加时间 :min:sec to date in PHP

mysql - 如何选择帖子及其所有相关帖子?

MySQL Sum() 多列