PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

ecshop实现定时任务,我先说下我的思路,也请你们给出思路

原创
2016-07-06 13:52:14 1425浏览

需求描述:

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

直接根据创建时间批量更新,一条语句执行完毕,每天定时执行即可,
当前时间 - (创建时间+86400*14)

UPDATE user SET user_type = 'old' WHERE (unix_timestamp(now()) - (create_time+86400*14))

你可以评估一下你的数据库增量,因为其实你可以每天将今天变成老用户的修改一下,这样子筛选的数据量会大幅度降低

对user表的create_time添加索引(索引字段必须放在where中的左边),执行以下sql,

UPDATE user SET user_type = 'old' WHERE create_time 

每天凌晨3:00执行即可(truncate),100万条数据不算很多

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。