Cassandra中如何基于time类型列查询数据?已尝试查询未获结果
解决Cassandra中基于TIME类型列检索数据的问题
嘿,我来帮你排查下这个查询没返回数据的问题~首先咱们得从Cassandra的主键设计和查询规则入手分析:
1. 先看你的主键设计是否合理
你提到transaction_time是主键,但Cassandra的主键分分区键和聚类键,这俩的作用完全不同:
- 如果
transaction_time是分区键:那每条数据会根据transaction_time的哈希值分布到不同节点上。这时候你用范围查询(>=/<=)加ALLOW FILTERING,Cassandra得遍历所有节点的所有分区,不仅效率极低,还可能因为数据分布的问题漏查;再加上transaction_date不是主键的话,这个条件会强制全表扫描,很容易出问题。 - 正确的设计应该是把
transaction_date作为分区键,transaction_time作为聚类键——这样同一天的数据会存在同一个分区里,你可以高效地按时间范围查询,还不需要ALLOW FILTERING。比如表定义应该是这样:CREATE TABLE payment_transactions_by_transactiondate ( transaction_date DATE, transaction_time TIME, -- 这里加上你的其他业务列 PRIMARY KEY (transaction_date, transaction_time) );
2. 调整你的查询语句
如果按照上面的正确表结构,查询语句可以简化成这样,完全不需要ALLOW FILTERING,而且能精准定位到数据:
SELECT * FROM payment_transactions_by_transactiondate WHERE transaction_date='2018-03-21' AND transaction_time >= '00:00:00' AND transaction_time <= '23:59:59';
3. 排查当前查询无效的可能原因
如果暂时不想改表结构,先排查这几点:
- 确认
transaction_time的类型:是不是真的是TIME类型?如果是TIMESTAMP的话,你用'00:00:00'这种纯时间字符串查询是无效的,得用完整的时间戳比如'2018-03-21 00:00:00'。 - 验证当天是否有数据:先执行这个简单查询看看能不能拿到数据:
如果查不到,说明当天确实没有数据;如果能查到,那问题就出在SELECT * FROM payment_transactions_by_transactiondate WHERE transaction_date='2018-03-21' LIMIT 10 ALLOW FILTERING;transaction_time的条件匹配上,可能是数据里的时间带毫秒(比如'00:00:00.000'),和你写的格式不匹配。 - 检查表结构:执行
DESCRIBE TABLE payment_transactions_by_transactiondate;,确认主键的组成和各列的数据类型,避免主键设计错误导致的查询问题。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

