如何处理海量数据查询并将时间控制在1秒以内?
Posted
技术标签:
【中文标题】如何处理海量数据查询并将时间控制在1秒以内?【英文标题】:How to handle massive data query and control the time within 1 sec? 【发布时间】:2010-08-26 02:39:10 【问题描述】:我正在思考一个问题,如果我得到一张表,并且其中的数据不断增长,千、百万、十亿.... 有一天,我认为即使是一个简单的查询也需要几秒钟才能运行。 那么有什么方法可以将时间控制在 1 秒或任何合理的时间之内?
【问题讨论】:
我觉得你的问题太笼统了。有很多方法可以优化查询,最好取决于表以及它是如何被索引或如何被索引的。其他解决方案涉及分解数据,但同样取决于您未描述的数据。 【参考方案1】:分区。您可以做的最快的 I/O 是您不需要做的。
索引。视情况而定,并非针对每一列。您不能让每个查询都以内存速度运行,因此您必须进行选择。
现实主义。您不会在一秒钟内通过关系引擎处理十亿个 I/O。
【讨论】:
【参考方案2】:一定要把它散开。
您可以使用 Hive (http://wiki.apache.org/hadoop/Hive) 之类的东西进行 SQL 查询。
每次查询需要几分钟,因为您有 10 万行或 1000 亿行。您将拥有存储在许多不同计算机上的数据,尽管有 hadoop 的魔力,但您的查询将转到数据所在的位置,执行该部分的查询,然后返回结果。
或者,对于具有更多限制的更快查询,请查看 Hbase (http://hbase.apache.org/#Overview)。它也位于 hadoop 之上,并且在减少类似 SQL 的权衡方面速度更快。
【讨论】:
【参考方案3】:认为您应该社区 wiki 这样做,因为不会有一个正确的答案(或者您的问题会更具体)。
首先,扩展 Tim 的索引。 Btree 索引就像一个倒置的金字塔。您的 Root/'level 0' 块可能指向一百个'level 1' 块。它们每个都指向一百个“2 级”块,它们每个都指向一百个“3 级”块。那是一百万个“级别 3”块,可以指向一亿个数据行。读取该数据集中的任何行需要五次读取(可能除了最后两个之外的所有行都缓存在内存中)。再上一层将您的数据集提升两个数量级。索引的扩展性非常好,因此如果您的应用程序用例在非常大的数据集中处理小数据量,那没问题。
分区可以看作是索引的另一种形式,您希望在其中快速排除工作的重要部分。
当您希望在更大的数据集中处理大型数据集时,数据仓库设备是第二种解决方案。通常,解决方案是将磁盘扔到问题上,有或没有专用于这些磁盘的 CPU/内存来解决问题。
分布式数据库主要解决的是一种不同形式的可扩展性,即大量并发用户。 CPU 只能处理这么多内存,因此 CPU 只能处理这么多用户,而无需他们争夺内存。复制在一定程度上起作用,尤其是对于旧式读取繁重的应用程序。较新的 NoSQL 数据库正在解决的问题是这样做并获得一致的结果,包括管理备份和恢复以恢复一致性。他们通常通过追求“最终一致性”来做到这一点,接受暂时的不一致性作为可扩展性的权衡。
我敢说,很少有 NoSQL 数据库的数据量已经排除了 RDBMS 解决方案。相反,推动分布式数据库的是用户/事务/写入量。
固态存储也将发挥作用。最近棕色旋转圆盘的问题与旋转能力无关。它们的速度不够快,无法快速访问您可以存储在它们上面的所有数据。闪存驱动器/卡/内存/缓存基本上消除了阻碍一切的“寻找”时间。
【讨论】:
【参考方案4】:索引将解决您 90% 的问题。在二叉树中从一百万个中查找一个唯一元素只需要遍历 30 个节点(占记录总数的 0.003%)。
根据数据,您可以制作汇总表。因此,如果您记录统计数据并每 5 分钟采样一次,您可以简单地将数据汇总到一个表格中,其中每一行代表一个小时、一天等时间段内的平均读数。
【讨论】:
以上是关于如何处理海量数据查询并将时间控制在1秒以内?的主要内容,如果未能解决你的问题,请参考以下文章