卡桑德拉 + 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

中提供

要求是:

  1. 所有喜欢 post 按 like_time 订购并让他们使用的用户 ID: select * 来自 PostLike 其中 post_id = ?

  2. 所有 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)"

请建议我在这里需要做什么:

  1. 需要将 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_iduser_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,您的数据将不会按预期顺序排序,因为排序仅在指定分区键时有效。