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中解决这个问题,您必须进行非规范化,在这种情况下,您可以通过两种可能的方式来实现:
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(我想要宽列、可扩展的存储)。我想知道这些东西是如何工作的,对于分布式宽列存储,我认为在构建/反规范化模式时,了解在后台工作的方式是非常重要的。幸运的是,有很多关于卡桑德拉内部技术细节的博客。感谢你的链接,它准确地解释了我对缩放和索引的想法。