Java 如何处理海量数据查询并将时间控制在1秒以内?

Java 如何处理海量数据查询并将时间控制在1秒以内?,java,oracle,query-optimization,Java,Oracle,Query Optimization,我正在思考一个问题,如果我得到一个表,其中的数据不断增长,成千上万,十亿…… 有一天,我想即使是一个简单的查询,它也需要几秒钟才能运行。 那么,我们有什么方法可以将时间控制在1秒以内或任何合理的时间内呢?一定要把它摊开 您可以使用类似于Hive()的东西进行SQL查询 无论是10万行还是1000亿行,每个查询都需要几分钟的时间。您将有数据生活在许多不同的计算机上,尽管hadoop的魔力,您的查询将转到数据生活的地方,执行该部分的查询,并返回结果 或者,要获得具有更多限制的更快的查询,请查看Hba

我正在思考一个问题,如果我得到一个表,其中的数据不断增长,成千上万,十亿……
有一天,我想即使是一个简单的查询,它也需要几秒钟才能运行。 那么,我们有什么方法可以将时间控制在1秒以内或任何合理的时间内呢?

一定要把它摊开

您可以使用类似于Hive()的东西进行SQL查询

无论是10万行还是1000亿行,每个查询都需要几分钟的时间。您将有数据生活在许多不同的计算机上,尽管hadoop的魔力,您的查询将转到数据生活的地方,执行该部分的查询,并返回结果

或者,要获得具有更多限制的更快的查询,请查看Hbase()。它还位于hadoop之上,在与不太像SQL的程序进行权衡时,速度稍微快一点

  • 分区。你能做的最快的I/O就是你不需要做的I/O

  • 索引。视情况而定,不是针对每一列。您不能让每个查询都以内存速度运行,因此您必须进行挑选

  • 现实主义。您不会在一秒钟内通过关系引擎处理十亿个I/O


  • 索引将解决90%的问题。在二叉树的一百万个节点中找到一个唯一的元素只需要遍历30个节点(占记录总数的0.003%)

    根据数据,您可以创建聚合表。因此,如果您记录统计数据并每5分钟采样一次,您可以简单地将数据汇总到一个表中,每行代表一小时、一天等期间的平均读数。

    您认为应该这样做,因为没有一个正确答案(或者您的问题会更具体)

    首先,扩展Tim的索引。树索引就像一个倒置的金字塔。您的根/“0级”块可能指向100个“1级”块。他们每个点指向一百个“二级”区块,每个点指向一百个“三级”区块。这是一百万个“3级”块,可以指向一亿个数据行。这需要五次读取才能到达该数据集中的任何一行(可能除了最后两次读取外,其他所有读取都缓存在内存中)。再提高一个级别,数据集将提升两个数量级。索引的伸缩性非常好,所以如果您的应用程序用例在一个非常大的数据集中处理小数据量,您就可以了

    分区可以看作是索引的另一种形式,您希望快速排除工作的重要部分

    当您希望在更大的数据集中处理大型数据集时,数据仓库设备是第二种解决方案。通常,解决方案是在出现问题时抛出磁盘,使用或不使用专用于这些磁盘的CPU/内存来分割问题

    分布式数据库主要解决不同形式的可伸缩性,即大量并发用户的可伸缩性。一个CPU只能处理这么多的内存,因此一个CPU只能处理这么多的用户,而不必为内存而争吵。复制在一定程度上起到了作用,尤其是对于旧式的高读应用程序。较新的NoSQL数据库解决的问题是这样做并获得一致的结果,包括管理备份和恢复以恢复一致性。他们通常通过追求“最终一致性”来做到这一点,接受暂时的不一致性作为可伸缩性的折衷

    我冒昧地说,很少有NoSQL数据库的数据量排除了RDBMS解决方案。相反,推送分布式数据库的是用户/事务/写入卷


    固态存储也将发挥作用。最近棕色旋转圆盘的问题与旋转时的容量关系不大。它们不能足够快地访问您可以存储在其上的所有数据。闪存驱动器/卡/内存/缓存基本上占用了“查找”时间,而这正是阻碍一切的原因

    我认为你的问题太笼统了。优化查询的方法有很多,哪种方法最好取决于表以及它被索引或可以被索引的方式。其他解决方案包括分解数据,但这同样取决于您没有描述的数据。