大型表的性能问题

时间:2014-09-01 05:45:53

标签: mysql performance

我正在一个用户执行不同任务的网站上工作。用户的每个活动都记录在表格中。对于绩效衡量标准,超过12个月的记录将移至另一个表格。但是一张桌子的记录已超过4000万,而另一张桌子则达到2000万。

用户分为3组。

  1. 90天内点击的人
  2. 在180天内点击的人
  3. 谁没有点击超过180天
  4. 我运行一个cron作业,根据上述检查更新这些用户的组。

    现在的问题是数据很大,有时cron作业崩溃了。在这里提一下,表的日期列是没有索引,我现在害怕将其编入索引,因为它可能会使表崩溃,我可能无法恢复它。

    应该采取什么解决方案?我今后如何处理这个问题,因为今年年底记录会进一步增加。

    以下是查询:

    UPDATE users
        INNER JOIN(
            SELECT users.userid, max(b.click_date ) click_date
            FROM users
            INNER JOIN (
                SELECT userid, max( clickdate ) click_date
                FROM user_clicks
                WHERE DATEDIFF( CURDATE( ) , clickdate ) > 180
                GROUP BY userid
                UNION
                SELECT unique_code userid, max( clickdate ) click_date
                FROM user_clicks_archived
                WHERE DATEDIFF( CURDATE( ) , clickdate ) > 180
                GROUP BY unique_code    
    
            )b ON users.userid = b.userid
            WHERE users.status =1
            GROUP BY users.userid
    
        ) FINAL_CLICKS on FINAL_CLICKS.userid = users.userid
    SET users.groupid = '3'
    

1 个答案:

答案 0 :(得分:1)

对其进。即使四十万行是DB中相对较小的表,但如果您经常对其进行全表扫描则不行。


或者,您的业务要求与交付的内容之间似乎存在脱节。

如果你需要知道的唯一的事情(a)是用户所属的那三组中的哪一组,那么存储每一个事件都会浪费大量的资源。

您可以存储每个用户最后一次点击,然后使用查询对其进行操作,这与(SQL伪代码)一致:

select username from users where datediff (now, lastclick) > 180 days

(a)可能存在其他有效理由来存储每个事件。如果是这样,请忽略此建议。但是你仍然应该设计你的表以提高效率,这意味着合适的索引。