2014-09-01 68 views
0

我正在一个网站上进行用户执行不同任务的工作。用户的每项活动都记录在一张表中。对于业绩衡量标准,超过12个月的记录将被移至另一个表格。但是一张桌子的记录已经达到了四千万,另一张桌面的记录达到了两千万。用户分为3组。大型表格的性能问题

  1. 在90天内
  2. 在180天内谁点击
  3. 谁没有点击180天以上

我运行一个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' 
+0

*我现在恐怕索引它,因为它可能会使表崩溃,我可能无法恢复它* ...如果您定期备份数据,这不会是一个问题。 – 2014-09-01 05:51:03

+0

点击发生得如此之快。虽然我支持它,但如果出现问题,我仍有可能错过重要的点击次数。此外,你是否也可以告诉我可以采取的其他措施? – 2014-09-01 05:55:39

+1

你有可能将这些表分成三个表吗? (用户低于90)和(用户从90到180)和(用户高于180)。情景是,用户输入将首先创建在90以下的表中,然后可能每晚(或者只要系统中的负载最小)运行cron作业来更新记录并将记录移动到下一级表中。并同时在单独的表上运行更新查询。如果这是不可能的,那么在您的最低负载时间拍摄数据库快照并在日期上应用索引,然后重试。 – 2014-09-01 06:02:07

回答

1

应该指数它,确保它的备份,如果你真的很担心以后(你可以计划的停机时间这一点,如果你真的很偏执) 。甚至四千万行是DB数据库中相对较小的表格,但如果您经常对其进行全表扫描,则不是。


或者,您的业务需求与交付的内容之间似乎存在断开。

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

你可以只保存最后一次每个用户点击,然后使用查询作用于的是,沿着东西线(SQL伪代码):

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

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

+0

我不只是为了团体的目的而使用它,而是为他的活动显示一个日志给用户。好的,我将在日期栏中介绍这个索引。但是我的其他担心是桌子的瓶颈。在几个月或几年的时间里,我的桌子就会被填满。我应该怎么做呢?手动创建存档表是一件令人头痛的事情。 – 2014-09-01 06:12:55

+1

@Raja,如果手动操作很痛苦,你_automate_它。某些DBMS'可以根据年龄自动传输记录,或者前端分区,因此您不必这样做。 MySQL是否可以做到这一点,我不知道。 – paxdiablo 2014-09-01 06:18:01

+0

是的,MySQL确实支持分区。我期待有人来说服我。谢谢你的想法。我将继续讨论这个话题,以便其他人可能会讨论分区问题。 – 2014-09-01 06:21:57