2013-10-16 190 views
0

我用卡珊德拉2.0和cqlsh:SELECT COUNT(*)返回0,但我有800行

cqlsh:node1> SELECT count(*) FROM users; 

count 
------- 
    0 

(1 rows) 

但是當我做:

cqlsh:node1> select id from users LIMIT 10; 

id 
-------------------- 
8acecf2 
f638215 
8b33e24 
470a2cb 
0f9a5c2 
4c49298 
2e28a56 
b42ce98 
19b68c5 
2a207f2 

(10 rows) 

我的用戶表有5個 「文本」 列擁有超過100Kb的base64數據。 當我做一個SELECT * FROM users; cqlsh需要3秒鐘才顯示數據。

任何人都有解決方案嗎?

是否可以製作COUNT(column)

ps:你需要什麼?日誌?哪裏?

+1

在第一個查詢中,您從用戶表中選擇了count(*),但是從視頻中選擇了秒。 –

+0

@Ilya Bursov我修復了它,只是輸入錯誤 –

回答

0

您需要重新思考,爲什麼您的應用程序需要計數。如果您擁有數百萬/數十億行,則計數將耗費時間/資源。

如果您的應用程序對於「近似」計數的用戶可以,那麼您可以使用「nodetool cfstats」。它會讓你的密鑰數量(用戶)估計和一般準確。

如果你需要「確切」,那麼有不同的技術來做到這一點。

  • 當有新行插入時,您可以維護一個特殊行並不斷添加列。現在您可以計算列數來獲取行數。
+0

謝謝你的回答。 –

1

需要算起做什麼是指定一個限制:

,如果你確信「行」的數量小於500萬(500萬),那麼你可以在cql3.0做到:

select count(*) from mycolumnfamilyname limit 5000000; 
+0

我指定了一個列名代替(*),並使用了上面的語句,沒有使用「限制...」這個名稱;至少可以回到2.2.3,上面提到了與數百萬的行。 – Jess

0

爲了統計特定的列,您必須具有WHERE子句中的列。

例如,假設「ID」列是主鍵,你可以這樣做:

SELECT COUNT(id) FROM users WHERE id > ''; 

如果列不是主鍵,那麼你必須允許過濾爲:

SELECT COUNT(name) FROM users WHERE name > '' ALLOW FILTERING; 

正如其他人所說,這很慢,如果您期望有大量用戶,則需要LIMIT關鍵字。緩慢來自Cassandra逐一讀取所有行的事實,並且從我所理解的事實來看,它讀取整行(即每次都會加載真正的大列),因爲它們沒有辦法只讀一行列過濾時。但現在Cassandra 3.x可能已經有所改善。

如果你真的需要這個數字,你可以使用鎖定並增加一個代表用戶數量的字段。不知何故,如果它不同步,你也可以有一段時間調整數字的過程。