卡桑德拉 + Mysql
Cassandra + Mysql
嗨,我是 Cassandra 的新手。在下面的场景中,我对数据库设计有点困惑。
目前我有 3 个table:帖子、用户、喜欢的帖子。
发布:存储post信息
用户 : 存储用户信息
帖子赞:
CREATE TABLE PostLike (
like_time timestamp
post_id bigint,
user_id bigint,
PRIMARY KEY (like_time,post_id,user_id)
);
like_time : 用于存储 post 按 post 排序的时间。
cassandra 在 OrderPreservingPartitioner
中提供
要求是:
所有喜欢 post 按 like_time 订购并让他们使用的用户 ID:
select * 来自 PostLike 其中 post_id = ?
所有 post 用户喜欢
select * 来自 PostLike,其中 user_id = ? : 它给出了错误
[Invalid query] message="PRIMARY KEY column "post_id" cannot be
restricted (preceding column "ColumnDefinition{name=user_id,
type=org.apache.cassandra.db.marshal.LongType, kind=CLUSTERING_COLUMN,
componentIndex=0, indexName=null, indexType=null}" is either not
restricted or by a non-EQ relation)"
请建议我在这里需要做什么:
需要将 MySQL 与 Cassandra 一起用于这些关系
或
在 cassandra 中创建 2 个单独的 table
CREATE TABLE PostLike (
like_time timestamp
post_id bigint,
PRIMARY KEY (like_date,post_id)
);
CREATE TABLE UserLike (
like_time timestamp
user_id bigint,
PRIMARY KEY (like_date,user_id)
);
或任何其他解决方案。请帮忙。
如果我创建索引,下面的错误解决。
CREATE INDEX post_id_PostLike_indx ON post_like (post_id);
CREATE INDEX user_id_PostLike_indx ON post_like (user_id);
[Invalid query] message="PRIMARY KEY column "post_id" cannot be
restricted (preceding column "ColumnDefinition{name=user_id,
type=org.apache.cassandra.db.marshal.LongType, kind=CLUSTERING_COLUMN,
componentIndex=0, indexName=null, indexType=null}" is either not
restricted or by a non-EQ relation)"
首先,您收到该错误是因为您指定了主键的第二部分,而没有指定第一部分。在 Cassandra 中通过复合主键查询时,不能跳过部分键。您 可以 将键末尾的部分保留下来(例如,只需按分区键查询(见下文),但如果您尝试跳过部分键,它将不起作用关键。
接下来,二级索引在 Cassandra 中的工作方式与在 MySQL 中不同。在 Cassandra 中,提供它们是为了方便,而不是为了性能。 post_id
和 user_id
的基数可能太高而效率不高。特别是在具有数百万行的大型集群中,二级索引查询性能将在高基数二级索引上显着下降。
解决这个问题的正确方法是使用您的第二个选项(如 etherbunny 推荐的那样),但要重新排序您的主键。
CREATE TABLE PostLike (
like_time timestamp
post_id bigint,
PRIMARY KEY (post_id,like_date)
);
CREATE TABLE UserLike (
like_time timestamp
user_id bigint,
PRIMARY KEY (user_id,like_date)
);
Cassandra 主键中的第一个键称为分区键。此键将确定您的行将存储在哪个标记范围内。
Cassandra 主键中的其余键称为 clustering columns。集群列有助于确定磁盘上的排序顺序 在分区键 .
中
最后一部分很重要,因为它(聚类顺序,以及 ORDER BY
关键字)的行为与 MySQL 或任何 RDBMS 非常不同。这样,如果你 SELECT * FROM user_like WHERE user_id=34574398 ORDER BY like_date
你应该看到 user_id 由 like_date 排序的喜欢。事实上,即使没有 ORDER BY
子句,它们仍应按 like_date 排序。但是,如果您SELECT * FROM user_like ORDER BY like_date
,您的数据将不会按预期顺序排序,因为排序仅在指定分区键时有效。
嗨,我是 Cassandra 的新手。在下面的场景中,我对数据库设计有点困惑。
目前我有 3 个table:帖子、用户、喜欢的帖子。
发布:存储post信息
用户 : 存储用户信息
帖子赞:
CREATE TABLE PostLike (
like_time timestamp
post_id bigint,
user_id bigint,
PRIMARY KEY (like_time,post_id,user_id)
);
like_time : 用于存储 post 按 post 排序的时间。 cassandra 在 OrderPreservingPartitioner
中提供要求是:
所有喜欢 post 按 like_time 订购并让他们使用的用户 ID: select * 来自 PostLike 其中 post_id = ?
所有 post 用户喜欢 select * 来自 PostLike,其中 user_id = ? : 它给出了错误
[Invalid query] message="PRIMARY KEY column "post_id" cannot be restricted (preceding column "ColumnDefinition{name=user_id, type=org.apache.cassandra.db.marshal.LongType, kind=CLUSTERING_COLUMN, componentIndex=0, indexName=null, indexType=null}" is either not restricted or by a non-EQ relation)"
请建议我在这里需要做什么:
需要将 MySQL 与 Cassandra 一起用于这些关系
或
在 cassandra 中创建 2 个单独的 table
CREATE TABLE PostLike (
like_time timestamp
post_id bigint,
PRIMARY KEY (like_date,post_id)
);
CREATE TABLE UserLike (
like_time timestamp
user_id bigint,
PRIMARY KEY (like_date,user_id)
);
或任何其他解决方案。请帮忙。
如果我创建索引,下面的错误解决。
CREATE INDEX post_id_PostLike_indx ON post_like (post_id);
CREATE INDEX user_id_PostLike_indx ON post_like (user_id);
[Invalid query] message="PRIMARY KEY column "post_id" cannot be restricted (preceding column "ColumnDefinition{name=user_id, type=org.apache.cassandra.db.marshal.LongType, kind=CLUSTERING_COLUMN, componentIndex=0, indexName=null, indexType=null}" is either not restricted or by a non-EQ relation)"
首先,您收到该错误是因为您指定了主键的第二部分,而没有指定第一部分。在 Cassandra 中通过复合主键查询时,不能跳过部分键。您 可以 将键末尾的部分保留下来(例如,只需按分区键查询(见下文),但如果您尝试跳过部分键,它将不起作用关键。
接下来,二级索引在 Cassandra 中的工作方式与在 MySQL 中不同。在 Cassandra 中,提供它们是为了方便,而不是为了性能。 post_id
和 user_id
的基数可能太高而效率不高。特别是在具有数百万行的大型集群中,二级索引查询性能将在高基数二级索引上显着下降。
解决这个问题的正确方法是使用您的第二个选项(如 etherbunny 推荐的那样),但要重新排序您的主键。
CREATE TABLE PostLike (
like_time timestamp
post_id bigint,
PRIMARY KEY (post_id,like_date)
);
CREATE TABLE UserLike (
like_time timestamp
user_id bigint,
PRIMARY KEY (user_id,like_date)
);
Cassandra 主键中的第一个键称为分区键。此键将确定您的行将存储在哪个标记范围内。
Cassandra 主键中的其余键称为 clustering columns。集群列有助于确定磁盘上的排序顺序 在分区键 .
中最后一部分很重要,因为它(聚类顺序,以及 ORDER BY
关键字)的行为与 MySQL 或任何 RDBMS 非常不同。这样,如果你 SELECT * FROM user_like WHERE user_id=34574398 ORDER BY like_date
你应该看到 user_id 由 like_date 排序的喜欢。事实上,即使没有 ORDER BY
子句,它们仍应按 like_date 排序。但是,如果您SELECT * FROM user_like ORDER BY like_date
,您的数据将不会按预期顺序排序,因为排序仅在指定分区键时有效。