如何设计用于用户操作日志的 Cassandra 方案?
How to design Cassandra Scheme for User Actions Log?
我在 MYSQL 中有一个像这样的 table 来记录用户操作:
CREATE TABLE `actions` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`module` VARCHAR(32) NOT NULL,
`controller` VARCHAR(64) NOT NULL,
`action` VARCHAR(64) NOT NULL,
`date` Timestamp NOT NULL,
`userid` BIGINT(20) NOT NULL,
`ip` VARCHAR(32) NOT NULL,
`duration` DOUBLE NOT NULL,
PRIMARY KEY (`id`),
)
COLLATE='utf8mb4_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=1
我有一个 MYSQL 像这样的查询来找出每天特定操作的计数:
SELECT COUNT(*) FROM actions WHERE actions.action = "join" AND
YEAR(date)=2017 AND MONTH(date)=06 GROUP BY YEAR(date), MONTH(date),
DAY(date)
我需要 50 - 60 秒才能得到包含 "join" 个操作的天数列表,其中只有 500 万行以及日期和操作中的索引。
所以,我想使用 Cassandra 记录操作,那么如何设计 Cassandra 方案以及如何查询以在 1 秒内获得此类请求。
CREATE TABLE actions (
id timeuuid,
module varchar,
controller varchar,
action varchar,
date_time timestamp,
userid bigint,
ip varchar,
duration double,
year int,
month int,
dt date,
PRIMARY KEY ((action,year,month),dt,id)
);
说明:
With abobe table 定义
SELECT COUNT(*) FROM actions WHERE actions.action = "join" AND yaer=2017 AND month=06 GROUP BY action,year,month,dt
将命中单个分区。
在 dt
列中只有日期...也许您可以将其更改为只有 int
作为数据类型的日期,因为 id
是 timeuuid
.. 它会独一无二。
注意: Cassandra 3.10及以上版本支持GROUP BY
我在 MYSQL 中有一个像这样的 table 来记录用户操作:
CREATE TABLE `actions` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`module` VARCHAR(32) NOT NULL,
`controller` VARCHAR(64) NOT NULL,
`action` VARCHAR(64) NOT NULL,
`date` Timestamp NOT NULL,
`userid` BIGINT(20) NOT NULL,
`ip` VARCHAR(32) NOT NULL,
`duration` DOUBLE NOT NULL,
PRIMARY KEY (`id`),
)
COLLATE='utf8mb4_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=1
我有一个 MYSQL 像这样的查询来找出每天特定操作的计数:
SELECT COUNT(*) FROM actions WHERE actions.action = "join" AND
YEAR(date)=2017 AND MONTH(date)=06 GROUP BY YEAR(date), MONTH(date),
DAY(date)
我需要 50 - 60 秒才能得到包含 "join" 个操作的天数列表,其中只有 500 万行以及日期和操作中的索引。
所以,我想使用 Cassandra 记录操作,那么如何设计 Cassandra 方案以及如何查询以在 1 秒内获得此类请求。
CREATE TABLE actions (
id timeuuid,
module varchar,
controller varchar,
action varchar,
date_time timestamp,
userid bigint,
ip varchar,
duration double,
year int,
month int,
dt date,
PRIMARY KEY ((action,year,month),dt,id)
);
说明: With abobe table 定义
SELECT COUNT(*) FROM actions WHERE actions.action = "join" AND yaer=2017 AND month=06 GROUP BY action,year,month,dt
将命中单个分区。
在 dt
列中只有日期...也许您可以将其更改为只有 int
作为数据类型的日期,因为 id
是 timeuuid
.. 它会独一无二。
注意: Cassandra 3.10及以上版本支持GROUP BY