是否有可能在cassandra中有效地实现这种查询?
说我有一张桌子
TPanel
我想以下列方式查询此表:
CREATE TABLE something(
a INT,
b INT,
c INT,
d INT,
e INT
PRIMARY KEY(a,b,c,d,e)
);
或
SELECT * FROM something WHERE a=? AND b=? AND e=?
或
SELECT * FROM something WHERE a=? AND c=? AND d=?
等等。
以上所有查询都无法正常工作,因为cassandra需要查询才能按顺序指定群集列。
我通常知道这种情况需要创建一些物化视图或将数据反规范化为几个表。但是,在这种情况下,我需要制作4 * 3 * 2 * 1 = 24 表,这基本上不是一个可行的解决方案。
辅助索引要求必须启用SELECT * FROM something WHERE a=? AND b=? AND d=?
选项才能使多个索引查询起作用,这似乎是一个坏主意。此外,在某些东西表中可能会有一些高基数列。
我想知道是否有任何工作可以让这样复杂的查询工作?
答案 0 :(得分:0)
你如何以24桌结束?我没有得到这个。 如果您的查询在3列上具有相等条件。那么,是不是10个不同的查询? 5C3。 也许我部分了解你的要求,你真的需要n =(24)个查询。但这是我的建议:
找出任何具有低基数的列,并创建一个二级索引以满足至少一个查询。
要避免的事情: 不要使用1个基表和23个物化视图。将此比率保持为1(基数):5或8(mviews)。因此从应用程序端进行非规范化是值得的。
您可以在基表中使用uuid作为主键,以便在物化视图中使用它们。
总的来说,即使您有24个查询,也要尝试下到4或5个基表,然后在每个基表上创建5或6个物化视图,以达到预期的24或其他数量。
答案 1 :(得分:0)
您可以使用SOLR和Cassandra来获取此类查询以与Cassandra一起使用。如果您使用DSE,则更容易。在SOLR查询中,您可以直接写:
SELECT * FROM keyspace.something WHERE solr_query='a:? b:? e:?'
请参阅以下链接,其中显示了您可以与SOLR一起使用的所有可能组合
答案 2 :(得分:0)
写入在C *中非常有效。同时使用分区键读取也是有效的。
创建2个表索引和内容:
CREATE TABLE somethingIndex(
a_index text PRIMARY KEY,
a INT
);
CREATE TABLE something(
a INT PRIMARY KEY,
b INT,
c INT,
d INT,
e INT
);
在写入期间,通过连接那些值来插入(a,b,c,d,e)的所有组合。
5个元素与3个组合最大值将是11个插入:10个INSERT in somethingIndex + 1 INSERT into something。
这将非常有效,而不是使用solr或其他解决方案,如物化视图。 如果需要全文搜索,请检查solr。对于上面的精确搜索解决方案是有效
读取数据,首先选择" a"来自somethingIndex的值,然后从某个表中读取。
SELECT a FROM somethingIndex where a_index = ?; // (a+b+e) or (a+c+d) or (a+b+d);
SELECT * FROM something where a = ?;