为了账号安全,请及时绑定邮箱和手机立即绑定

PHP做mysql分表统计大数据如何做

PHP做mysql分表统计大数据如何做

PHP
慕斯709654 2019-03-10 16:39:19
背景是这样的:根据用户id分20张表记录核心数据,由于用户与用户之间所拥有的可能存在重复数据,所以每天晚上都要对总体数据进行去重统计,也就是要将20张表的数据合并去重(去重条件是姓名和联系方式一模一样),而且每天晚上都要跑这个任务 由于20张表的数据超过千万,而且还会增加,不太可能通过sql去重统计。我现在的做法是逐行读取将去重字段(姓名和联系方式)md5然后存入redis集合(会自动去重),最后用redis统计(办法很蠢,可是想不出其他办法了),但是这样脚本会跑接近两个小时,有时候还会失败 还有就是数据需要根据数据来源去重统计以及总数据去重统计,并且随时用户都有增删查改的操作,所以无法对所有数据汇总建立去重总表(如果建立去重总表,数据将分不出来源,无法统计,而且增删查改很难实时维护) 求助:请问各位大神,是否有比较靠谱的统计方案?急急急!(产品是爹,开发是孙子,再变态的需求也只能啃)
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

可以增量统计
除了第一次全量统计,以后只统计新增的(根据数据添加时间)和新更新的(根据数据更新时间)。

删除操作只做逻辑删除,每张表都应该有添加时间和更新时间并且更新时间最好设置为自动更新。
比如:

CREATE TABLE `table_name` (
  `xx` varchar(50) NOT NULL DEFAULT '' COMMENT 'xx',
  `del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '标志,0为有效,-1为无效',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='xxxxx';
查看完整回答
反对 回复 2019-03-18
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

产品脑残给你挖的坑,还要你在未来很长一段时间内去慢慢填。同情!

我来说一下我的思路。

增加两张表:

* #用户联系方式汇总
user_contact_aggregate
id         #id      
md5_str    #姓名+联系方式的MD5串
table_name #位于哪张表中
row_id     #指定张表中用户ID
key idx_md5_str(md5_str) #注意增加索引

* #记录统计脚本运行日志
user_run_aggregate_log
id          #id
table_name  #哪张表
last_row_id     #指定张表中最后的用户ID
last_time   #最后一次统计时间

操作过程是这样的:

  • 第一步:将所有的数据写到user_contact_aggregate表(本次需要时间长一点,后面就爽了),且记录一下运行日志.
  • 第二步:先从日志表中读出各表最后一次统计的最大的用户ID,然后从各表中查询出新增的用户(条件id是大于最后一次统计的用户ID,获取增量部分数据,这部分数据量小,统计效率高),再汇总用户联系方式且记录本次运行日志。

后续重复第二步!

user_contact_aggregate 表几千万条数据问题不大,按照md5_str查询效率很高.

查看完整回答
反对 回复 2019-03-18
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

你们的分表是采用多表,还是多表后再汇总到一张表,如果是后者,可以直接查出来在php处理就行了;多表的话好像就只能像你那样的利用redis了; 而且本身你们的表为何不设置成唯一字段,这样就不会这样麻烦了

查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 700 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信