簡體   English   中英

Cassandra 使用主鍵進行排序的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM