我该如何选择包含数千列的行?

时间:2015-01-05 08:29:06

标签: database cassandra

大约有几百万条记录看起来像这样。

idA(text), idB(int), prop1(boolean), prop2(boolean), ..., prop6000(boolean) (more prop's can be added later on)

主要任务是找到具有某些道具值组合的记录。 例如:SELECT idA, idB WHERE prop30=true AND prop1987=false AND ... AND prop5754=true

如果SELECT速度是主要问题,我应该如何处理这个问题?

-

我正在考虑将props定义为int列表,仅在值为true时添加值,并在SELECTing时使用CONATINS。 即:INSERT INTO tbl VALUES('id1', 1, [10, 24, 2977]) - >如果prop10,prop24和prop 2977是真的

但后来据说二级指数不能很好地扩展,不应该大量使用。 它甚至对于列表也适用吗? (我想是因为它们的排序可能会有所不同吗?)

1 个答案:

答案 0 :(得分:1)

Cassandra查询性能的关键之一是你必须 - 必须 - 在应用索引过滤器之前点击一个分区。此外,当您应用多个索引过滤器时,它只会命中一个索引并过滤其余的内存(即只使用一个索引)。在您的查询中,您没有访问分区,因此,它将是一个群集范围的查询,最有可能超时。

在cassandra 3.0中,随着全局索引的引入,规则将会有所放松。即便如此,您的查询也无法真正发挥作用。

如果您的所有属性都是布尔值,则可以考虑将它们存储为位域。然后一个整数可以容纳64个标志。这可能更有效率。一个查询方面,您仍然需要找到一个分区键,您将通过该分区键来分区。使用flags方法,您可以简单地读取整数并在客户端上执行过滤。将加载分区中的所有行,但除非您在同一分区中有数十万行,否则它应该不是问题。

如果您没有分区键,并且您可以查找的只是道具(如上例所示),那么您需要手动执行索引。内置索引不会真正起作用,您可以选择自己创建索引表(这可能非常困难)或使用像Lucene这样的索引服务,这将允许您快速进行搜索。