我會給你不好的方法來做到這一點。如果將這些行:
insert into foo (row,column,txt) values (1,1,'First Insert');
insert into foo (row,column,txt) values (1,2,'Second Insert');
insert into foo (row,column,txt) values (2,1,'First Insert');
insert into foo (row,column,txt) values (2,2,'Second Insert');
做一個
'select row from foo;'
會給你以下幾點:
row
-----
1
1
2
2
不顯着,因爲它顯示的行和列的所有可能的組合。要查詢得到一個行值,你可以添加一列值:
select row from foo where column = 1;
但隨後你會得到這樣的警告:
Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING
確定。然後與此:
select row from foo where column = 1 ALLOW FILTERING;
row
-----
1
2
很好。我想要的。不過,我們不要忽視那個警告。如果你只有很少的行數,比如說10000,那麼這將在性能上沒有太大的影響。現在如果我有10億呢?根據節點數量和複製因素,您的性能將受到嚴重影響。首先,查詢必須掃描表中的每個可能的行(讀全表掃描),然後過濾結果集的唯一值。在某些情況下,這個查詢將會超時。鑑於此,可能不是你想要的。
您提到您擔心插入到多個表中時性能受到影響。多個表格插入是完美有效的數據建模技術。卡桑德拉可以做大量的寫作。至於同步的痛苦,我不知道你確切的應用,但我可以給一般的提示。
如果您需要獨特的掃描,您需要考慮分區列。這就是我們所說的索引或查詢表。在任何Cassandra數據模型中要考慮的重要事情是應用程序查詢。如果我使用IP地址作爲行,我可能會創建類似這樣的內容來掃描我所有的IP地址。
CREATE TABLE ip_addresses (
first_quad int,
last_quads ascii,
PRIMARY KEY (first_quad, last_quads)
);
現在,插入一些行我192.xxx地址空間:
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000000001');
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000000002');
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000001001');
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000001255');
要獲得在192空間的不同行,我這樣做:
SELECT * FROM ip_addresses WHERE first_quad = 192;
first_quad | last_quads
------------+------------
192 | 000000001
192 | 000000002
192 | 000001001
192 | 000001255
要得到每一個地址,你只需要遍歷0-255的每一個可能的行鍵。在我的例子中,我希望應用程序要求特定的範圍來保持性能。你的應用程序可能有不同的需求,但希望你能看到這裏的模式。
這裏就是'選擇行FROM FOO;'我回報(與你的插入) cqlsh:測試> SELECT列FROM FOO; ' 行 ----- ' 這是我要求首先這個問題的原因(我的理解是如何與複合鍵的表持續) – edofic
@edofic沒有你找到除「DISTINCT」關鍵字之外的解決方案? – FelikZ
@FelikZ不,「DISTINCT」正是我想要的 – edofic