使用 TEXT 作为主键时是否有任何性能损失?
Are there any performance penalties when using a TEXT as a Primary Key?
如果是,如果我想要一个唯一的 TEXT 字段,数据模型会是什么样子?
没有。无论使用何种数据类型,Cassandra 都将所有数据(包括主键值)存储为十六进制字节数组。在性能方面,主键的数据类型真的无关紧要。
唯一重要的情况是 token/node 分布。这是因为为 "12345"
作为文本生成的令牌将不同于为 12345
作为 bigint 生成的令牌:
aploetz@cqlsh:Whosebug> CREATE TABLE textaskey (key text PRIMARY KEY, value text);
aploetz@cqlsh:Whosebug> CREATE TABLE longaskey (key bigint PRIMARY KEY, value text);
aploetz@cqlsh:Whosebug> INSERT INTO textaskey (key, value) VALUES ('12345','12345');
aploetz@cqlsh:Whosebug> INSERT INTO longaskey (key, value) VALUES (12345,'12345');
aploetz@cqlsh:Whosebug> SELECT token(key),value FROM textaskey ;
token(key) | value
---------------------+-------
2375712675693977547 | 12345
(1 rows)
aploetz@cqlsh:Whosebug> SELECT token(key),value FROM longaskey;
token(key) | value
---------------------+-------
3741197147323682197 | 12345
(1 rows)
但即使在这个例子中,一个人也不应该比另一个人表现 faster/different。
如果是,如果我想要一个唯一的 TEXT 字段,数据模型会是什么样子?
没有。无论使用何种数据类型,Cassandra 都将所有数据(包括主键值)存储为十六进制字节数组。在性能方面,主键的数据类型真的无关紧要。
唯一重要的情况是 token/node 分布。这是因为为 "12345"
作为文本生成的令牌将不同于为 12345
作为 bigint 生成的令牌:
aploetz@cqlsh:Whosebug> CREATE TABLE textaskey (key text PRIMARY KEY, value text);
aploetz@cqlsh:Whosebug> CREATE TABLE longaskey (key bigint PRIMARY KEY, value text);
aploetz@cqlsh:Whosebug> INSERT INTO textaskey (key, value) VALUES ('12345','12345');
aploetz@cqlsh:Whosebug> INSERT INTO longaskey (key, value) VALUES (12345,'12345');
aploetz@cqlsh:Whosebug> SELECT token(key),value FROM textaskey ;
token(key) | value
---------------------+-------
2375712675693977547 | 12345
(1 rows)
aploetz@cqlsh:Whosebug> SELECT token(key),value FROM longaskey;
token(key) | value
---------------------+-------
3741197147323682197 | 12345
(1 rows)
但即使在这个例子中,一个人也不应该比另一个人表现 faster/different。