【问题标题】:Working with large table in MySQL using Java使用 Java 在 MySQL 中处理大表
【发布时间】:2015-11-19 16:37:42
【问题描述】:

我正在尝试用 Java 做一个简单的应用程序,它应该从 MySQL DB 插入数据或读取数据。

但我面临的是,我无法快速使用我的桌子。假设我有两列的表。第一个'frst'是bigint unsigned unique,有1、2、3 .... 300 000 000的值。其次,我们称它为'result',是mediumint,其值如1、1、2、3、1, 3, 2 ... 1, 3, 1 - 对于每个“第一个”。

嗯,现在,我有数百万条记录。实际上,DB 文件有 19GB。

当我尝试运行时(从 table_name where result = 2 中选择第一个),需要很长时间。

在我的 java 应用程序中,我使用 JDBC 和 Statement / ResultSet 进行读取,使用 PreparedStatement 进行插入。

谁能告诉我,如何处理这样的大桌子?谢谢!!

【问题讨论】:

  • 添加你已有的代码
  • 尝试使用LIMIT 加载记录或检查w3schools.com/sql/sql_top.asp,因为没有用户会同时需要所有数据。

标签: java mysql


【解决方案1】:

首先,如果您将检索大量条目,则预计查询需要一些时间来检索所有条目。您可以考虑对结果进行一些分页,以改善用户体验。

其次,提高查询性能的方法是创建如下索引:

create index my_idx on table_name(result, frst);

查看mysqldoc了解更多详情。

【讨论】:

  • 丹,谢谢你的建议。我一定要试一试。我现在在想的是,如果我尝试获取 BigInt 类型的 300000000 个值,每个值 8b,ResultSet 必须处理 300000000*8bytes,即 2.4GB。这可能是为什么它很慢的问题。不是吗?
  • 是的,如果您要检索大量数据,则会降低性能。就像我提到的那样,您应该检索页面中的数据(使用 mysql 限制),或者如果您需要根据 result 或每 frst 计算某些值,例如 sum、avg、min、max 或其他聚合函数,您如果可以的话,应该在 sql 中计算它们。
【解决方案2】:

根据您要对表中的数据执行的操作,您可能需要将一些逻辑推送到数据库(如计数、最大值、最小值、平均值...),因为它们是为处理大量数据而构建的数据。除此之外,这还将减少数据库和应用程序之间的流量。

【讨论】:

    【解决方案3】:

    您可以尝试为您正在处理的列建立索引,这样可以更快地搜索它们。

    CREATE INDEX yourIndexName
    ON YOUR_TABLE_NAME(YOUR_COLUMN_NAME);
    

    请注意,更新或插入新记录时,这可能会导致性能下降,因为索引也必须更新/插入。更多信息请参考here

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 2011-11-29
      • 2016-04-15
      • 2011-09-20
      • 1970-01-01
      • 2014-06-23
      • 2010-10-31
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多