Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果数据对于NoSQL中的一个分区来说太大,如何避免查询速度慢?_Sql_Cassandra_Nosql_Bigdata_Data Modeling - Fatal编程技术网

如果数据对于NoSQL中的一个分区来说太大,如何避免查询速度慢?

如果数据对于NoSQL中的一个分区来说太大,如何避免查询速度慢?,sql,cassandra,nosql,bigdata,data-modeling,Sql,Cassandra,Nosql,Bigdata,Data Modeling,我在学卡桑德拉。现在,我在思考NoSQL解决的SQL问题,我有一个关于大数据案例的问题 关于SQL处理非常大的数据,我想很多页面都在说表将位于不同的服务器上,查询速度很慢,因为连接了不同服务器上的表。这是NoSQL解决的SQL问题。但是,即使使用NoSQL,如果分区太大,我不需要更改我的数据模型,创建更小的分区并对它们进行多个查询以获得相同的结果吗?而且,这不是很慢吗?或者,您永远不会因为2B单元足够大而耗尽分区中的空间?我认为您的问题混合了几个不同的问题 首先,大数据和SQL的问题通常不是查询

我在学卡桑德拉。现在,我在思考NoSQL解决的SQL问题,我有一个关于大数据案例的问题


关于SQL处理非常大的数据,我想很多页面都在说表将位于不同的服务器上,查询速度很慢,因为连接了不同服务器上的表。这是NoSQL解决的SQL问题。但是,即使使用NoSQL,如果分区太大,我不需要更改我的数据模型,创建更小的分区并对它们进行多个查询以获得相同的结果吗?而且,这不是很慢吗?或者,您永远不会因为2B单元足够大而耗尽分区中的空间?

我认为您的问题混合了几个不同的问题

首先,大数据和SQL的问题通常不是查询速度变慢,而是解决方案无法随着数据越来越大而扩展。如果按照您的建议,选择手动将表拆分为多个服务器,那么当您需要更多服务器时,您会怎么做?重新设计您的数据模型?另外,当更新需要修改多个表但它们位于不同的主机上时,如何确保一致性

其次,您提到了连接,这是像Cassandra这样的NoSQL解决方案所不支持的。您需要自己手动反规范化数据(即,将已连接的数据放入表中)。在某些方面,Cassandra的新“物化视图”功能可以派上用场

第三,也许是最重要的一点,您询问了巨大的分区。事实上,Cassandra并不是为处理巨大的分区而设计的,最佳实践远远低于您提到的20亿硬限制:Datastax(Cassandra开发背后的商业公司)建议,一个好的经验法则是“将最大行数保持在100000项以下,磁盘大小保持在100MB以下。”

在Cassandra中,大型分区是不明智的,有几个原因。其中之一是磁盘格式(sstables和它们所谓的“提升索引”)使得跳转到一个巨大分区的中间效率很低,当您想要读取一个特定的行或遍历所有的行时,需要这样做。某些操作(如压缩和修复)在整个分区上工作,可能会变得非常慢(在最坏的情况下,还会占用大量内存)。例如,两个节点上的十亿行分区仅相差一行,基于分区的修复需要通过网络发送整个分区

Scylla(),一个Cassandra克隆,通常比ApacheCassandra更高效,对于大分区也有类似的问题(在Cassandra中,中等大小的分区是可以的),但这些问题正在积极解决,包括重新设计文件格式,因此最终Scylla应该支持任意大小的分区。然而,我们还没有做到这一点,今天不让分区变得太大的建议仍然适用于“锡拉”


最后,如果您想解决单个分区中行太多的问题,那么,是的,您需要调整数据模型以避免这些巨大的分区。有时,您只需要修复模型中的设计错误——例如,我看到人们将大量不相关的数据粘贴到同一个分区中,而这些数据本可以轻松(而且更有效)地)放在单独的分区中。有时,您需要人为地分割分区。这在Cassandra所谓的“时间序列数据”建模中很常见,例如,我们每秒都会得到某个度量值的一个新值,并将其作为一行添加到分区中。在这里,与所有数据都有一个巨大的分区不同,公认的做法是在每个时间窗口创建一个单独的分区(例如,每天、每周或任何时候创建一个新分区)。因为大多数查询只涉及一个时间窗口,所以它们甚至不会变慢。

我认为您的问题混合了几个不同的问题

首先,大数据和SQL的问题通常不是查询速度变慢,而是解决方案无法随着数据越来越大而扩展。如果按照您的建议,选择手动将表拆分为多个服务器,那么当您需要更多服务器时,您会怎么做?重新设计您的数据模型?另外,当更新需要修改多个表但它们位于不同的主机上时,如何确保一致性

其次,您提到了连接,这是像Cassandra这样的NoSQL解决方案所不支持的。您需要自己手动反规范化数据(即,将已连接的数据放入表中)。在某些方面,Cassandra的新“物化视图”功能可以派上用场

第三,也许是最重要的一点,您询问了巨大的分区。事实上,Cassandra并不是为处理巨大的分区而设计的,最佳实践远远低于您提到的20亿硬限制:Datastax(Cassandra开发背后的商业公司)建议,一个好的经验法则是“将最大行数保持在100000项以下,磁盘大小保持在100MB以下。”

在Cassandra中,大型分区是不明智的,有几个原因。其中之一是磁盘格式(sstables和它们所谓的“提升索引”)使得跳转到一个巨大分区的中间效率很低,当您想要读取一个特定的行或遍历所有的行时,需要这样做。某些操作(如压缩和修复)在整个分区上工作,可能会变得非常慢(在最坏的情况下,还会占用大量内存)。例如,两个节点上的十亿行分区仅相差一行,基于分区的修复需要通过网络发送整个分区

Scylla(),一个Cassandra克隆,通常比ApacheCassandra更高效,在大分区方面也有类似的问题(如C