为什么SELECT with子句在Cassandra的表上返回0行?(应返回2行)

为什么SELECT with子句在Cassandra的表上返回0行?(应返回2行),select,cassandra,cql,cassandra-2.0,Select,Cassandra,Cql,Cassandra 2.0,我在Cassandra 2.0.9数据库上创建了一个最小的users表示例。我可以使用SELECT选择它的所有行,但我不明白为什么在索引的COLLMN上添加我的WHERE子句会返回0行 我也不明白为什么“COINTAINS”语句在这里会导致错误,如下所示,但假设这不是我主要关心的问题 DROP TABLE IF EXISTS users; CREATE TABLE users ( KEY varchar PRIMARY KEY, password varchar, gender

我在Cassandra 2.0.9数据库上创建了一个最小的users表示例。我可以使用SELECT选择它的所有行,但我不明白为什么在索引的COLLMN上添加我的WHERE子句会返回0行

我也不明白为什么“COINTAINS”语句在这里会导致错误,如下所示,但假设这不是我主要关心的问题

DROP TABLE IF EXISTS users; 
CREATE TABLE users 
(
  KEY varchar PRIMARY KEY,
  password varchar,
  gender varchar,
  session_token varchar,
  state varchar,
  birth_year bigint
);

INSERT INTO users (KEY, gender, password) VALUES ('jessie', 'f', 'avlrenfls');
INSERT INTO users (KEY, gender, password) VALUES ('kate', 'f', '897q7rggg');
INSERT INTO users (KEY, gender, password) VALUES ('mike', 'm', 'mike123');

CREATE INDEX ON users (gender);

DESCRIBE TABLE users; 
输出:

CREATE TABLE users (
  key text,
  birth_year bigint,
  gender text,
  password text,
  session_token text,
  state text,
  PRIMARY KEY ((key))
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};

CREATE INDEX users_gender_idx ON users (gender);
这个选择可以正常工作

这并不是:

这也失败了:


听起来您的索引可能已损坏。试着重建它。从命令提示符下运行此命令:

nodetool rebuild_index yourKeyspaceName users users_gender_idx
然而,这里更大的问题是二级索引的性能较差。他们甚至将其作为反模式使用。数据税有其特殊性。这绝对不是其中之一

在基数极低的列(如布尔列)上创建索引没有意义。例如,索引中的每个值都成为索引中的一行,导致所有假值都有一个巨大的行。为大量具有foo=true和foo=false的索引列编制索引是没有用的

虽然性别可能不是布尔列,但它具有相同的基数。在这个专栏上建立二级索引是个糟糕的主意

如果按性别查询是您真正需要做的事情,那么您可能需要找到一种不同的方法来建模或划分数据。例如,主键状态、性别、键将允许您按状态查询性别

SELECT * FROM users WHERE state='WI' and gender='f';

这将返回威斯康星州的所有女性用户。当然,这意味着您还必须单独查询所有状态。但归根结底,Cassandra无法很好地处理低基数键/索引的查询,因此您必须创造性地解决这些类型的问题。

尝试从性别类似“%f;你好从性别类似“%f”的用户中选择*;返回错误的请求:第1:33行输入'LIKE'I cross-verified SELECT*时没有可行的替代方案,其中性别='f';肯定有用。检查f的开头或结尾是否有空格。我真的很困惑。我执行了三重检查,刚刚重新启动系统,但我一直收到0行。同时按键过滤:从key='kate'所在的用户中选择*;wokrs ok返回1行。虽然这似乎不合逻辑,但请尝试从性别在“f”中的用户中选择*;你能告诉我性别栏的长度/大小吗?谢谢你,布莱斯+我特别欣赏关于数据建模或分区的不同方法的评论。我想我会暂时保持在构建新表之前删除索引的想法,而不是以后重建它,这对我来说似乎更简单。
SELECT * FROM users WHERE gender CONTAINS 'f';

Bad Request: line 1:33 no viable alternative at input 'CONTAINS'
nodetool rebuild_index yourKeyspaceName users users_gender_idx
SELECT * FROM users WHERE state='WI' and gender='f';