2015-04-29 110 views
1

我是cassandra的新手,我想弄清楚为什么我无法通过created_at日期订购我的日志。 以下是表格说明,选择结果和我尝试创建的选择语句。Cassandra集群密钥无法订购

[email protected]:mytable> DESCRIBE TABLE mytable.log; 

    CREATE TABLE mytable.log (
     id uuid, 
     created_at timestamp, 
     deleted boolean, 
     level text, 
     message text, 
     obj text, 
     obj_name text, 
     origin text, 
     user int, 
     PRIMARY KEY (id, created_at) 
    ) WITH CLUSTERING ORDER BY (created_at DESC) 
     AND bloom_filter_fp_chance = 0.01 
     AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
     AND comment = '' 
     AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'} 
     AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
     AND dclocal_read_repair_chance = 0.1 
     AND default_time_to_live = 0 
     AND gc_grace_seconds = 864000 
     AND max_index_interval = 2048 
     AND memtable_flush_period_in_ms = 0 
     AND min_index_interval = 128 
     AND read_repair_chance = 0.0 
     AND speculative_retry = '99.0PERCENTILE'; 
    CREATE INDEX deleted_idx ON mytable.log (deleted); 
    CREATE INDEX level_idx ON mytable.log (level); 
    CREATE INDEX message_idx ON mytable.log (message); 
    CREATE INDEX origin_idx ON mytable.log (origin); 
    CREATE INDEX user_idx ON mytable.log (user); 

    [email protected]:mytable> SELECT * FROM mytable.log WHERE "created_at" <= '2015-04-29 00:00:00' AND "user" = 20 LIMIT 10; 

    id         | created_at    | deleted | level | message | obj                                                                                    | obj_name | origin   | user 
    --------------------------------------+--------------------------+---------+-------+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------------+------ 
    a98a98d5-5710-431b-a23d-d78ece882763 | 2015-04-28 19:18:34-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:18:34.159619+00:00', 'id': 143L, 'content': u'192.213.216.16', 'change_date': 1430277514, 'owner_id': 20L} | Record | update_a_record | 20 
    893e9600-3d57-4b82-bdfd-41586023a90f | 2015-04-28 19:21:01-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:21:01.414393+00:00', 'id': 143L, 'content': u'192.213.15.16', 'change_date': 1430277661, 'owner_id': 20L} | Record | update_a_record | 20 
    f951b3ec-092a-4e9e-95c5-a6dce3363c29 | 2015-04-28 19:18:35-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:18:35.199869+00:00', 'id': 143L, 'content': u'192.213.15.16', 'change_date': 1430277515, 'owner_id': 20L} | Record | update_a_record | 20 
    db60ac52-39e9-4b46-accb-28a34b10579c | 2015-04-28 19:18:37-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:18:37.650135+00:00', 'id': 143L, 'content': u'192.213.15.16', 'change_date': 1430277517, 'owner_id': 20L} | Record | update_a_record | 20 
    336acc47-6a93-4ff9-a6c5-d29d3b2c4e35 | 2015-04-28 19:23:24-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:23:24.146505+00:00', 'id': 143L, 'content': u'192.213.15.16', 'change_date': 1430277804, 'owner_id': 20L} | Record | update_a_record | 20 
    4ca66f70-36cb-47cc-9324-6a5747d6a592 | 2015-04-28 19:18:48-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:18:48.242689+00:00', 'id': 143L, 'content': u'192.213.15.16', 'change_date': 1430277528, 'owner_id': 20L} | Record | update_a_record | 20 
    dbfda8bc-f6f2-4b97-b3c1-ccaff21338bb | 2015-04-28 19:18:32-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:18:32.857508+00:00', 'id': 143L, 'content': u'192.213.15.16', 'change_date': 1430277512, 'owner_id': 20L} | Record | update_a_record | 20 
    6c05779a-d3b8-40ac-84ee-af91a3bf6b15 | 2015-04-28 19:18:47-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:18:47.181657+00:00', 'id': 143L, 'content': u'192.213.216.16', 'change_date': 1430277527, 'owner_id': 20L} | Record | update_a_record | 20 
    a037fb9d-cb58-4994-baad-88c441429199 | 2015-04-28 19:18:31-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:18:31.680786+00:00', 'id': 143L, 'content': u'192.213.216.16', 'change_date': 1430277511, 'owner_id': 20L} | Record | update_a_record | 20 
    66ee42af-6770-4ef8-a300-764246ccc8ff | 2015-04-28 19:20:33-0400 | False | net | updated | {'prio': None, 'type_id': u'A', 'auth': None, 'is_free': False, 'ttl': 300L, 'active': True, 'domain_id': 32L, 'ordername': None, 'name': u'myrecord.mytable.net', 'created': '2015-04-14 17:44:23+00:00', 'modified': '2015-04-29 03:20:33.336544+00:00', 'id': 143L, 'content': u'192.213.15.16', 'change_date': 1430277633, 'owner_id': 20L} | Record | update_a_record | 20 

我不明白的是,它不按降序排列的created_at列。 我的最终目标是将我的应用程序的日志存储在此表中,然后只能在仪表板中显示它们中的一些,这就是为什么我限制为10的原因。

我在这里做错了什么? 问候

回答

3

What I don't understand is that it doesn't order by the created_at column in a descending order.

因为卡桑德拉将只执行一个分区键内的聚类顺序。您的分区密钥是id。但是看起来它具有几乎独一无二的基数。如此独特,如果您对其进行分区,则不会有任何数据可以进行分类。

SELECT * FROM mytable.log 
WHERE "created_at" <= '2015-04-29 00:00:00' AND "user" = 20 LIMIT 10; 

为了满足此查询,您应该通过创建分区user一个单独的查询表,如logByUser。你会想该表具有相同的列,但像这样的主键定义:

PRIMARY KEY (user, created_at, id) 

此主键定义将允许你希望下面的查询的功能:

SELECT * FROM mytable.logByUser 
WHERE "created_at" <= '2015-04-29 00:00:00' AND "user" = 20 LIMIT 10; 

另外,我想指出两点:

  1. 卡桑德拉功能最好的时候,你设计你的数据模型,以满足您的查询模式。这可能意味着为每个查询创建一个表。尽管听起来很疯狂,但创建五个或六个表以满足您的每个潜在查询将执行很多比向一个表中添加5个二级索引更好。

  2. 二级索引是为了方便,而不是表现。他们的使用是一个已知的卡桑德拉反模式。在低基数列(特别是布尔型)上使用它们会带来麻烦。它们不是用来弥补数据模型缺点的“魔力”。

+0

如果我理解正确,我必须创建一个包含这些列(user,created_at,id)的新表,然后查询此表。这意味着从代码的角度来看,我必须做出双重插入。一个用于原始数据,一个用于查询。我理解这个权利吗? – DoRivard

+0

@DoRivard正确。您也可以将插入物批处理以提供一些原子性。 – Aaron

+0

非常感谢,我会考虑今天实施,我会让你知道。我将使用此http://cqlengine.readthedocs.org/en/latest/topics/queryset.html#batch-queries来尝试您正在讨论的批次。再次感谢。 – DoRivard

相关问题