[英]Cassandra best practice to ORDER BY using PRIMARY KEY
最初我有一個這樣的 cassandra 表:
CREATE TABLE table (
open_time timestamp,
open double,
close double,
high double,
low double,
volume bigint,
PRIMARY KEY(open_time));
open_time | close | high | low | open | volume
---------------------------------+--------+--------+-------+--------+--------
2020-08-05 06:00:00.000000+0000 | 181.53 | 184.32 | 181.1 | 184.32 | 100
2020-08-04 06:00:00.000000+0000 | 181.53 | 184.32 | 181.1 | 184.32 | 100
我需要執行查詢以獲取最新的 open_time。 在注意到像這樣的查詢之后
SELECT open_time FROM table ORDER BY open_time DESC LIMIT 1;
不允許,我想知道這里的最佳做法是什么。
我的想法是添加一個 id 列,我可以使用open_time作為聚類順序。 就像是:
CREATE TABLE table (
id int,
open_time timestamp,
open double,
close double,
high double,
low double,
volume bigint,
PRIMARY KEY(id, open_time)
)
WITH CLUSTERING ORDER BY (open_time DESC);
這是完成工作的有效解決方案還是有更好的方法,例如沒有額外 id 列的方法,因為我永遠不會查詢 id itslef。
大多數查詢是這樣的:
SELECT * FROM table WHERE open_time >= '2013-01-01 00:00:00+0200' AND open_time <= '2013-08-13 23:59:00+0200';
謝謝!
如果提到 id 作為主鍵,它必須包含在 where 子句中,否則它需要允許過濾。 您可以嘗試使用“Select max(open_time)...”進行查詢,否則您可以像上面那樣使用 id,它會隨着每條記錄而遞增,結果,具有最高值的 id 將始終具有最新記錄。
CLUSTERING ORDER
在每個分區內強制執行磁盤排序順序。 因此,不可能通過您正在分區的相同鍵進行排序。 按id
分區將面臨類似的挑戰,因為CLUSTERING ORDER BY open_time
將僅在每個id
內強制執行。
我想知道這里的最佳做法是什么。
像這樣的模型通常通過時間分桶來解決,正如我在今天早些時候對類似問題的回答中提到的那樣。 對於 select 最佳“存儲桶”,您需要了解您的業務案例,例如每天的條目數以及查詢要求。
舉個例子,假設那個月效果最好。 如果每一行都包含一個值“YEAR-MONTH”,則 PK 定義將如下所示:
PRIMARY KEY (month_bucket,open_time))
WITH CLUSTERING ORDER BY (open_time DESC);
然后,您可以支持這樣的查詢:
SELECT * FROM table
WHERE month_bucket = '2013-08'
AND open_time >= '2013-08-01 00:00:00+0200' AND open_time <= '2013-08-13 23:59:00+0200';
同樣,查詢最近的條目只需要最近(當前?)月份作為參數:
SELECT * FROM table
WHERE month_bucket = '2020-08'
LIMIT 1;
由於結果存儲在按open_time
降序排序的每個month_bucket
中,該查詢將返回最新的條目。
我為 DataStax(幾年前)寫了一篇與此問題相關的文章。 它已移至其網站的新部分,該部分對格式進行了處理,但內容肯定在那里。 讀一讀; 希望對您有所幫助:我們將有秩序!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.