时间:2021-07-01 10:21:17 帮助过:25人阅读
user用户表中有约100万条用户记录,现在想根据注册时间(create_time)这个字段,
判断该用户是老用户还是新用户(user_type new新用户 old老用户)
1、新用户:注册两周内,14(含)天以内。
2、老用户:注册两周以上,14(不含)天以上。
我的思路如下:
因为ECShop不是纯OOP的框架,所以我打算在根目录建个crontab目录
里面新建个user.php
user.php里面 先统计出整张表的总记录数 total
然后分页获取100条,循环update 整张表的数据
查询的时候 where条件过滤已经是老用户的数据
也就是说where永远是 user_type='new',整个表
默认全是new
问题来了,表里有100万条记录,我怕执行我PHP脚本的时候
循环查库会把数据库MySQL拖垮,咋办?
100万数据每一页100条,那就是1万页,如何处理呢?
for循环这个思路是否可靠?
需求描述:
user用户表中有约100万条用户记录,现在想根据注册时间(create_time)这个字段,
判断该用户是老用户还是新用户(user_type new新用户 old老用户)
1、新用户:注册两周内,14(含)天以内。
2、老用户:注册两周以上,14(不含)天以上。
我的思路如下:
因为ECShop不是纯OOP的框架,所以我打算在根目录建个crontab目录
里面新建个user.php
user.php里面 先统计出整张表的总记录数 total
然后分页获取100条,循环update 整张表的数据
查询的时候 where条件过滤已经是老用户的数据
也就是说where永远是 user_type='new',整个表
默认全是new
问题来了,表里有100万条记录,我怕执行我PHP脚本的时候
循环查库会把数据库MySQL拖垮,咋办?
100万数据每一页100条,那就是1万页,如何处理呢?
for循环这个思路是否可靠?
我觉得这件事儿不着急动手,最好还是先分析一下需求,其要点是老用户和新用户有什么区别?同时是否涉及批量操作(如给老用户群发站短属于批量操作,而某特定优惠必须当前用户是老用户才能用则不属于批量操作)。
很多时候这个新老用户只是显示上的区分,没有什么本质的变化,或者说总是应用在当前登录者自身,此时你根本没必要增加一个 user_type 字段,直接判断当前用户的create_time - time()是否大于142460*60就足够用了。
如果确实需要该功能也不需要过于担心,还是注意细节:
1- 首次更新是针对所有数据的,一条update语句搞定,你早晨早来一会儿在数据库上直接执行一下就行了(请再三确认语句正确),比你想象的快得多。
2- 定时更新: 注意,你每次仅需要针对 user_type = new and create_time < ... 的用户执行检查,而不是所有人,因此不存在性能问题。最近14天难道能注册10万人?user_type和create_time字段应该进行索引,这也是提高效率必须的。
直接根据创建时间批量更新,一条语句执行完毕,每天定时执行即可,
当前时间 - (创建时间+86400*14)< 0 表示新用户
UPDATE user SET user_type = 'old' WHERE (unix_timestamp(now()) - (create_time+86400*14)) < 0;
你可以评估一下你的数据库增量,因为其实你可以每天将今天变成老用户的修改一下,这样子筛选的数据量会大幅度降低
对user表的create_time添加索引(索引字段必须放在where中的左边),执行以下sql,
UPDATE user SET user_type = 'old' WHERE create_time < date_sub(curdate(),interval 14 day)
每天凌晨3:00执行即可(truncate),100万条数据不算很多