直接在数据库上处理大量数据是个好主意吗?

Posted

技术标签:

【中文标题】直接在数据库上处理大量数据是个好主意吗?【英文标题】:Is a good idea do processing of a large amount of data directly on database? 【发布时间】:2011-08-29 23:30:29 【问题描述】:

我有一个存储了很多网页的数据库。

我将需要处理我拥有的所有数据,因此我有两个选择:将数据恢复到程序或使用我将创建的一些函数直接在数据库中处理。

我想知道的是:

在数据库中做一些处理,而不是在应用程序中是好的 想法? 什么时候推荐,什么时候不推荐? 有优缺点吗? 是否可以将语言扩展到新功能(外部 API/库)?

我尝试将内容检索到应用程序(有效),但速度很慢而且很脏。我的 当务之急是不能在数据库中做什么我可以在Java中做什么,但我不知道这是不是真的。

只是一个例子:我有一个名为Token 的表。目前,它有 180,000 行,但这将增加到超过 1000 万行。我需要做一些处理来知道两个标记为“专有名称”之间的单词是否是名称的一部分。

我需要处理所有数据。在这种情况下,直接在数据库上做比检索到应用程序更好?

【问题讨论】:

你在处理什么样的数据库?我认为答案将取决于此。 @c0de:检查问题标签。 我相信 c0deNinja 说的是数据库的目的 数据库的目的是存储我拥有的所有信息。我的应用程序的最终目的是一个包含一些提取数据的数据库,而不是在程序中的使用。为此,我需要执行一些文本和统计操作。基本思想是所有表都会有很多数据,所有数据都必须传递给各种处理。 您可以使用专用的文本搜索引擎,例如 Sphinx 进行 Token 查询:我将它与 2+ 百万个文档索引一起使用,甚至使用通配符(用于部分匹配)和排名执行的高级查询在几分之一秒内。在这种情况下,您甚至可以拥有一个专用/单独托管的服务器来平衡负载。 【参考方案1】:

我的注意力是不能在数据库中做什么我可以做什么 Java,但我不知道这是不是真的。

不,这不是一个正确的假设。有使用数据库处理数据的有效情况。例如,如果它涉及调用许多可以在存储过程中组合的不同 SQL,那么您应该在存储过程中进行处理并从您的 java 应用程序中调用存储过程。这样您就可以避免多次网络访问才能访问数据库服务器。

我不知道你在处理什么。您是否正在解析存储在数据库中的 XML 数据?那么也许您应该使用 XQuery 并且许多现代数据库都支持它。

仅举一个例子:我有一个名为 Token 的表。目前,它有 180,000 行,但这将增加到超过 1000 万行。我需要 做一些处理以知道两个标记之间的单词是否分类 因为“专有名称”是否是名称的一部分。

数据中是否有一些指示符表明它是正确的名称?获取 1000 万行(极易受到 OutOfMemoryException 的影响)然后遍历它们并不是一个好主意。如果有关于数据的某些参数可以放在 SQL 中的 where 子句中以限制正在获取的数据数量,我认为这是要走的路。当然,您需要对您的 SQL 进行解释,检查正确的索引是否到位,检查索引集群比率,索引类型,所有这些都会有所作为。现在,如果您不能完全消除所有“不当名称”,那么您应该尝试使用 SQL 尽可能多地消除,然后在应用程序中处理其余部分。我假设这是一个批处理应用程序,对吧?如果它是一个 Web 应用程序,那么您肯定希望创建一个批处理应用程序,以便在 Web 应用程序查询数据之前为您暂存数据。

我希望我的解释是有道理的。如果您有任何问题,请告诉我。

【讨论】:

不,不是 XML。它是文本,分类的单词。我想做的适合自然语言处理。我编辑了我的问题并写了一个我想做的事情的例子。【参考方案2】:

为每一件事直接与数据库交互是一项乏味的工作并且会影响性​​能...有几种方法可以解决这个问题...您可以使用索引、缓存或 Hibernate 等工具来保存所有数据在内存中,这样您就不需要每次操作都查询数据库...有一些工具,例如非常流行的 luceneIndexer,可以解决您每次访问数据库的问题...

【讨论】:

以上是关于直接在数据库上处理大量数据是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

存储图形对象是个好主意吗?

将验证/测试数据与训练数据混合是个好主意吗?

在小数据集上使用 GridSearch 并在大数据集上应用结果是个好主意吗?

软删除是个好主意吗? [复制]

将数以亿计的小图像存储到键/值存储或其他 nosql 数据库是个好主意吗?

在mysql中索引日期时间字段是个好主意吗?