每天新增8640w数据,怎么存储比较好

客户端每 10 秒产生一条数据(包含客户端的唯一 ID / 时间 / 业务数据),每个客户端每天生成 8640 条数据。
共 10000 个客户端,每天新增 8640w 条数据


数据示例:#

client_id start_time finish_time video_id
1 2021-12-27 11:05:21 2021-12-27 11:05:31 11
2 2021-12-27 11:05:25 2021-12-27 11:05:35 11
2 2021-12-27 11:05:35 2021-12-27 11:05:45 12

后期查询需求#

需要按客户端,指定时间范围查询,比如:

SELECT client_id,COUNT(video_id) FROM table WHERE video_id=11 start_time > 'xxxx' AND finish_time < 'xxx' GROUP BY client_id

也需要按业务数据查询,比如:

SELECT video_id, COUNT(client_id) FROM table WHERE  start_time > 'xxxx' AND finish_time < 'xxx' GROUP BY video_id

请问这种情况,数据应该怎么存储比较好?

本帖已被设为精华帖!
本帖由系统于 3年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 50

可以补充个数据结构出来。从现在的文字描述没办法理解你这个业务数据 指的是枚举字段还是一种数据结构。

3年前 评论
张三 (楼主) 3年前

TIDB 是你的不二选择

3年前 评论
张三 (楼主) 3年前
kolin 3年前
Sunn 3年前

如果不需要修改或删除数据,可以考虑第三方日志服务

3年前 评论
张三 (楼主) 3年前
liaosp 3年前

这个数据量有点大,可以考虑一下使用 mongodb 来存储日志类的数据,设置保存一段时间数据,之前的数据做一个或者多个统计表,然后定期删除已经做过统计表的数据,减少数据存储的量。

3年前 评论
张三 (楼主) 3年前
pi_phq 3年前
她来听我的演唱会 (作者) 3年前

hbase?

3年前 评论
张三 (楼主) 3年前

物联网行业? 使用 mongodb 吧 这种日志一般也只是查,甚至只是存档而已

3年前 评论
张三 (楼主) 3年前
她来听我的演唱会 3年前
张三 (楼主) 3年前

不知道楼主知道,时序性数据库不?这个是针对物联网海量数据设计的查询数据库。不过需要一定的学习难度。

3年前 评论
张三 (楼主) 3年前
fatrbaby

clickhouse

3年前 评论
梦想星辰大海

楼主关注一下这个:www.taosdata.com/cn/ php 的连接器是这个:github.com/Yurunsoft/php-tdengine

3年前 评论
张三 (楼主) 3年前

es 或者阿里云 sls 腾讯云日志服务

3年前 评论
游离不2

怎么存不是问题,怎么用才是你的问题

3年前 评论

只存不改的话,可以考虑下 MySQL 的 Archive 存储引擎

不过最终还是要看你要拿这些数据做什么

3年前 评论

elk 或者 mongodb

3年前 评论

按照你这个数据量,不要使用关系型数据库,使用时序数据库吧。类似数据上报一样了

3年前 评论
Rytia

1、楼上说时序性数据库可以,你可以试试 2、目前我自己在从事广告数据开发方向。这种场景下,如果数据只增不减,可以考虑直接采用 OLAP 列式的数据库,这点数据量还是很轻松的。楼上举得 clickhouse 就是个不错的选择,擅长做日志等明细数据

3年前 评论
张三 (楼主) 3年前

单客户端一天 8640 条数据,目前 1w 台客户端,一天 8640*1w=8640w 条数据,一年大概 315 亿条数据。

TDengine 的超级表感觉很不错,可以按客户端存到子表里,但是 TDengine 的查询功能好像不如 clickhouse 支持的好。

但是不知道 clickhouse 单表 (大概 10 列,都是 id,datetime 类型) 存几百亿数据数据会不会有啥问题。

昨天自己的电脑测试了下 clickhouse 单表三列 (id UInt32, name String, created Datetime) mergeTree 引擎,10 亿数据查询速度挺快(机器配置 AMD 2400G / 16G DDR4 3200 / 海康 c2000pro NVME 硬盘)

@Rytia @laravelcc @fatrbaby @梦想星辰大海

3年前 评论
张三 (作者) (楼主) 3年前
nion 3年前
梦想星辰大海 3年前

看了 TDengine 官网贴出的性能对比图,为啥 说性能远超 clickhouse ?

3年前 评论

有很多人推荐 clickhouse 类分析数据库,此类数据库适合多写少读,我认为这个场景作为多写多读的场景,更适合使用 MongoDB 分片实例,再根据读场景进行分表,比如说取某个视频下的开始结束时间,就根据视频 id 分表,然后记录开始,结束时间。用户 id, 极大减少每个表的数据量,根据用户 id 做一个索引,并且不用担心 video_id 增长带来的表过大问题,另外可以考虑删除过期数据,或者定期搬运数据到冷数据表

3年前 评论
张三 (楼主) 3年前
梦想星辰大海

试试用 bitmap 存储你的数据,比如搜索条件作为 key,业务数据作为 value,这个 value 是个 bitmap。 这样做的前提是你的 value 部分的值必须是 int

3年前 评论
张三 (楼主) 3年前
SanXiao

一天百万数据 目前再用 influxdb

3年前 评论

一天 3 亿数据。存 mysql 没问题、但是会定时清理、
分 rds 分表 分库 没问题

2年前 评论

这种 应该上时序数据了吧.. 搜索下吧

2年前 评论

如果都是这样的查询的话:

SELECT client_id,COUNT(video_id) FROM table WHERE video_id=11 start_time > 'xxxx' AND finish_time < 'xxx' GROUP BY client_id;
SELECT video_id, COUNT(client_id) FROM table WHERE  start_time > 'xxxx' AND finish_time < 'xxx' GROUP BY video_id;

是不是可以考虑按时间查询颗粒精确度建立一个汇总表,类似于

    insert into(client_id,log_day,log_hour,log_count) values (1,2022-12-29,10,100);

这样算一下能否提高效率

2年前 评论

楼主,您好,我目前也在 ClickHouse、TDengine 中选型,想问下,您当时为什么选择了前者?

1年前 评论
张三 (楼主) 1年前