【问题标题】:How l can load databases in memory [closed]我如何在内存中加载数据库[关闭]
【发布时间】:2015-05-17 09:36:22
【问题描述】:


我的程序性能有问题。我有一个连接到 MySql 数据库的 java 程序并执行一些依赖于在数据库上执行 SELECT 查询的过程。
现在的问题是我的进程程序必须在 mySql 上执行 130,000 次选择查询,这需要很长时间。
我有 10 分钟的时间来完成所有过程。
知道如何在 10 分钟内最多执行 130000 个选择查询吗?

【问题讨论】:

  • 请发布一些数据结构。一般来说,添加适当的索引将有助于加快查询速度。
  • 130,000 SELECTs 很多,你确定你真的需要这么大的数字吗?我会尝试优化我的逻辑以降低该数字。无意冒犯,但尤其是 mysql 用户可能没有太多的 SQL 专业知识,并试图以低效的方式解决问题。你能详细说明一下实际的 SELECT 吗?
  • @dnoeth 我有一棵节点树,前缀为“12”、“120”、“1201”、“1202”等。我需要使用选择查询来获取每个节点的父节点和制作树。换句话说,我编写了一个选择查询,为每个节点执行此操作返回节点的父节点,并将父 ID 保存在节点中。现在我的树有 130000 个节点,我必须执行我的选择查询 130000 次。
  • 您似乎需要某种递归,而 mysql 不支持递归查询。但是每个递归都可以使用 WHILE 循环重写,并且 mysql 中有存储过程。如果你的树中的最大级别是已知的,你也许可以用一个 SELECT 来完成。你能展示现有的 SELECT + Java 逻辑吗?
  • @Punkbf 不要只在 cmets 中回答(它们会消失),edit 你的问题要包括所有基本信息。并添加数据结构和查询。

标签: java mysql sql performance select


【解决方案1】:

知道如何在 10 分钟内最多执行 130000 个选择查询吗?

每秒 200 次查询,这对于简单查询应该是可行的。但是,最简单的解决方案可能是通过加载所有需要的数据(您已经假设它适合内存)并在 Java 中处理它的单个查询来替换它们。

由于HashMap 比任何数据库都快几个数量级,因此任务将变得微不足道,您的机器也会感到无聊。

【讨论】:

    【解决方案2】:

    一种方法是使用 InMemory 数据库,如 H2 或 HSQL。仅当您可以将数据预加载到内存中时,此解决方案才有效。还需要考虑许多其他因素,例如数据量、数据库中数据的更改频率等。

    如果可以的话,可以直接在内存中查询,总是更快。

    1. 确定要加载到内存中的重要数据
    2. 在内存数据库中创建相应的表结构,如 H2 或 HSQL
    3. 从您的实际 MySQL 中加载这些数据并将其插入到 Memory DB 中
    4. 在该数据库中触发查询

    【讨论】:

    • 坦克我的朋友。在我看来,你的方法非常接近解决方案。但是你能解释一下具体是如何做到的吗?
    • 真的用hsql或者h2可以在10分钟内执行130000个select查询吗?
    • 您可以编写一个测试用例并进行相同的测试。我没试过。但我两者都用过,而且都是超音速,符合我们的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多