搜索

首页  >  问答  >  正文

最佳方法:使用Java 8在MySQL中检索、加密和更新数百万条记录

<p>我们有一个需求,需要从MySQL数据库中读取大约1000万条记录,对这些记录进行加密,并将加密后的值更新回字段中。 如何以最高效的方式实现这个需求。</p> <p><strong>1</strong>:使用AES_ENCRYPT从MySQL数据库进行字段级别的加密:据我了解,AES_ENCRYPT在varbinary上可以有效地工作,但我们的字段只是varchar类型。 因此排除了这个选项。</p> <p><strong>2</strong>:之前在我们的一个应用程序中已经使用了Java中的Executor功能来实现批量插入。但记录数不超过5万条。我们被要求使用类似的方法。因此排除了使用Spring Batch来实现。</p> <p>我正在寻找在Java 8 / MySQL数据库中需要考虑的可能特性。</p> <p>Java 8:使用Executor进行多线程处理,使用CompletableFuture进行异步处理,使用Streaming。</p> <p>MySQL:创建索引...</p>
P粉211600174P粉211600174495 天前657

全部回复(1)我来回复

  • P粉903052556

    P粉9030525562023-08-27 22:48:34

    • 对10M行数据进行任何操作都需要很长时间,并且可能会导致超时。
    • 如果您正在存储到MySQL中,您只能使用VARBINARYBLOB
    • 确保声明的数据类型至少比源数据大一点。(SELECT MAX(LENGTH(col)) FROM tbl)可以给出最大长度。
    • 考虑创建一个新表,在复制数据时将其转换为新表中的其他列。然后进行测试。
    • 考虑每次迭代处理1000行数据,使用PRIMARY KEY来跟踪“上次停下来的位置”,如果可行的话。(不要使用OFFSET)。有关分块的更多信息:http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks
    • 是的,使用某种批量插入方式。但是将批量的总大小限制在1MB左右。(16MB很难通过)。这可能会使您的数据量低于上面提到的1K。
    • 对整个表进行操作所需的时间不会与一次性操作相比,每次处理1K行有很大的区别。
    • 在加密数据时,将数据压缩也可能值得一试。这可能会使磁盘占用空间缩小3倍。

    回复
    0
  • 取消回复