Database design 快速查找100gb的数据

Database design 快速查找100gb的数据,database-design,Database Design,我有大约100GB的数据保存在~10MB.csv文件中。如何优化对该数据的数千个查询的查找速度?具体地说,我不知道要考虑什么技术或如何估计相对性能。 每个文件对于一个日期都是唯一的,并且包含多人的数据,例如: ... 2005-07-03, "Daffy Duck", ... 2005-07-03, "Daffy Duck", ... 2005-07-03, "Mickey Mouse", ... 2005-07-03, "Mickey Mouse", ... ... 我想提取与给定日期/名称

我有大约100GB的数据保存在~10MB.csv文件中。如何优化对该数据的数千个查询的查找速度?具体地说,我不知道要考虑什么技术或如何估计相对性能。 每个文件对于一个日期都是唯一的,并且包含多人的数据,例如:

...
2005-07-03, "Daffy Duck", ...
2005-07-03, "Daffy Duck", ...
2005-07-03, "Mickey Mouse", ...
2005-07-03, "Mickey Mouse", ...
...

我想提取与给定日期/名称对应的数千个日期/名称对的所有信息。等效的SQL查询将是
SELECT*FROM myDB,其中Date='2005-07-03'和Name='Mickey Mouse'

目前我还没有将数据加载到数据库中。为了执行我的“查询”,我找到了合适的日期文件,并按我要查找的名称筛选行。将数据存储在关系数据库、noSQL数据库或任何其他方式中,我会获得性能改进吗?如果是的话,为什么和多少

将数据存储在关系数据库、noSQL数据库或任何其他方式中,我会获得性能改进吗

是(我建议使用“普通”RDBMS)

如果是,为什么

这是索引的作用之一

…多少钱


很多

我肯定会使用数据库,但为这个问题选择合适的数据库需要更多的信息,特别是关于数据格式的信息。以下是我的建议,以及我何时选择其中一个的一些细节:

关系型:

如果您的所有数据都符合相同的模式(具有所有相同的字段),那么关系模式就有意义了。在您的问题中,您提到您只需要两个索引,
date
name

假设每个条目都有大量其他数据,那么SQL数据库将非常有意义(使用类似于查询的东西)

好处:

  • 你似乎已经知道它是如何工作的
  • 非常类似于CSV风格的做事方式
  • 您可以使用选择/加入(如果以后需要)
缺点:

  • 未使用字段的浪费空间
  • 无法很好地扩展(如果需要更多空间)
  • 可能有点过头了,因为问题不是令人尴尬的关系
NoSQL:

如果您的数据不符合相同的模式(许多不同的键只有几个共享键),那么文档存储将更有意义。因为您的数据是关系型的,所以MongoDB非常有意义

我将为您的数据库使用以下JSON指南:

{
    "name": "MickyMouse",
    "date": ...,
    other fields...
}
我会将
name
date
设置为索引,就像在SQL示例中一样。MongoDB速度很快,并且不会占用额外密钥的空间

这种方法的好处:

  • 缩放效果非常好(可以添加节点和碎片)
  • 使用起来非常简单
缺点:

  • 可能无法提供所需的功能
结论:

这两种方法都很好,但这实际上取决于数据的确切外观。一般来说,数据库非常擅长查询,而文件系统则不擅长查询,尤其是在数据越来越大的情况下

我个人会选择NoSQL路线,但我确实需要更多关于数据集和使用模式的信息。如果数据需要扩展,那么这可能是最好的选择


我不是一个真正的专家,但我只是不太喜欢使用SQL。如果数据是令人尴尬的关系型数据,那么SQL是非常有意义的,但似乎您所做的每件事都可以放在一个或两个表中。

我将在这里指出,使用关系型数据库或任何其他数据库“系统”可能无法获得更好的性能对于与将所有这些数据放入数据库所需的工作相关的特定操作

正如我建议将数据加载到某种数据库(即一个完整的编码数据管理系统)中一样,您的文件非常小。从您的问题来看,听起来您可以在固定时间内识别所需的文件,然后只需读取和过滤(可能使用正则表达式?)最多10MB的数据,那么您为什么需要关系数据库呢

只要识别文件并通过grep传递它,你就完成了,对吗?这很有效

具有适当索引(日期、名称)的关系数据库只会提高第二步的效率,即使如此,数据集还是相当小——每个10MB文件中有几千行

我知道这听起来像是一个非常粗糙的解决问题的方法,将所有内容都保存在文本文件中,但要保持简单。您必须管理数据的解析、验证和加载到数据库中,然后以数据库形式管理数据的附加存储等

您尚未提供任何信息,说明您需要多长时间执行此搜索,您如何处理结果中获得的数据,或任何其他性能和操作要求


如果您需要每秒多次执行此特定操作,或者希望以更具创造性的方式灵活处理数据,或者对当前位于单独文件中的数据或任何数量的类似数据执行任何类型的分析,然后,关系数据库立即成为数据管理的最佳选择。

其他人已经提供了一些好的观点,让我只谈谈物理数据库结构

如果可以的话,选择一个支持1的DBMS,并创建一个聚集(也称为索引组织)表,其主键是
{Date,Name,No}
2。然后,您的SELECT就可以满足于简单的索引范围扫描,并且根本没有堆访问(表堆甚至不存在),因此您不必担心坏消息。实际性能应该非常出色,可以很好地扩展到比您当前拥有的数据多得多的数据

如果您的DBMS支持,请打开它以消除存储(和缓存)c