Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
cassandra中的主键和索引_Cassandra - Fatal编程技术网

cassandra中的主键和索引

cassandra中的主键和索引,cassandra,Cassandra,卡桑德拉是新手,还在学习 create table url ( id_website int, url varchar, data varchar, primary key(url, id_website) ); 嗨,我有一个网站的url表 我不希望所有的url都在同一个节点上,这就是为什么主键是url优先,所以它将是分区键 大多数情况下,我将检索特定url的数据,例如:“url=?和id_网站=?” 但是,当我想要检索网站的部分/全部URL时,性能如何: select * f

卡桑德拉是新手,还在学习

create table url (
  id_website int,
  url varchar,
  data varchar,
  primary key(url, id_website)
);
嗨,我有一个网站的url表

我不希望所有的url都在同一个节点上,这就是为什么主键是url优先,所以它将是分区键

大多数情况下,我将检索特定url的数据,例如:“url=?和id_网站=?”

但是,当我想要检索网站的部分/全部URL时,性能如何:

select * from url where id_website = 1 allow filtering limit XX;
我认为这个查询将被发送到所有节点上,然后扫描id_website=1的表,直到达到限制,然后合并并发送回我的客户机

但是,这种扫描是使用索引并有效,还是逐个读取列id_网站的值并进行比较(因此无效)?我确实将id_网站设置为主键的一部分,所以我希望它能被索引,但我真的不知道

我们是否有一些关于cassandra的工具,比如mysql的解释,来检查查询是否使用索引

谢谢

--

编辑 使用id_website作为分区键创建第二个表(和 批量写入/删除)

我不想使用这个解决方案,因为我可能有一个或两个网站非常庞大,有数百万个URL(还有数百万其他网站几乎没有URL)

如果我在id_网站上有一个分区密钥,而这两个或三个网站停留在同一个节点上,则可能会导致存储问题,或者处理这些网站的节点可能会被请求过多,而另一个则一无所获。我希望将数据分布到所有节点上。这就是为什么我坚持在url上进行分区

在id_网站上创建二级索引(为 (你)

这个解决方案怎么样?如果我理解的话,每个节点都会有一个表,根据id_website索引它存储的行(所以不是其他节点的行)。因此,我可以将我的URL分布在多个节点上,我不会让一个节点处理包含特定网站所有URL的大型索引

现在当我使用我的查询

select * from url where id_website = 1 allow filtering limit XX;
每个节点都接收到查询,但这次它们不必循环通过分区(url列),它们可以直接在索引中查找属于id_网站的url,并返回行(或不返回任何内容)。对吧?


此解决方案的相反之处是,每次请求完成时,它都会命中每个节点,但是,由于有了新的索引,它应该是快速的?

您走的路是正确的。使用allow filtering,您只是要求cassandra扫描所有节点:非常无效
id\u网站
在每个分区内都编制了索引,但由于您没有告诉Cassandra去哪里,他必须点击所有分区(所有节点)即使那些不包含所选
id\u网站的信息的人
——一旦Cassandra命中一个分区,他们也知道如何查找该信息,并且不需要扫描整个分区来获取数据

要在Cassandra中解决这个问题,您必须进行非规范化,在这种情况下,您可以通过两种可能的方式来实现:

  • 创建第二个以id_website作为分区键的表(并批量写入/删除)
  • 在id_网站上创建二级索引(为您创建一个表)
  • **由于问题编辑而编辑** 您所说的是对的:二级索引作为“本地索引”处理——每个节点仅为其拥有的数据创建一个本地索引表。下面是关于二级索引(您已经了解)的一个示例

    创建索引后,必须从查询中删除
    ALLOW FILTERING

    嗯,,
    Carlo

    所以您告诉我,在这种情况下,id_网站索引不会用于接收查询的节点。它只在我做url=x和id\u网站=y的情况下使用,对吗?我告诉你,如果“url”表有3000个分区,其中1000个包含id\u网站=1的信息,cassandra将查询所有3000个分区,其中2000个将以空值回复,剩下的1000个将不会“扫描”自id_网站以来的分区在分区内编制索引。如果“url”表有3000个分区,其中1000个包含id_网站的信息=1,则cassandra将查询所有3000个分区。->好的,我想我理解了,就像在mysql中一样,如果你有一个主键(foo,bar),你不能在没有使用foo之前使用bar索引。->所以Cassandra会扫描所有的分区(url),并对每个url使用id_网站索引,但这是无效的,因为它必须先扫描分区?是的,我们使用了索引,但没有效果。谢谢@Carlo,如果你能看一下的话,我改进了我的问题。好吧,我正在为我的下一个软件寻找一个存储,我首先深入研究cassandra,然后是hbase(我想要宽列、可扩展的存储)。我想知道这些东西是如何工作的,对于分布式宽列存储,我认为在构建/反规范化模式时,了解在后台工作的方式是非常重要的。幸运的是,有很多关于卡桑德拉内部技术细节的博客。感谢你的链接,它准确地解释了我对缩放和索引的想法。