繁体   English   中英

是否加入另一张桌子?

[英]Joining to another table or not?

基本上我有2张桌子。 usersusers_activity 我使用mysql表并且用户数几乎达到5000.每个用户都有很多活动,大约有50-150个活动。 当我想要获取用户列表表(十点十分)时,我必须显示用户的上一个活动日期。 在这种情况下,我有两个选择:

第一选择:

我将列last_activity添加到users表并选择如下:

SELECT * FROM users ORDER BY id DESC, lIMIT 0, 10

如果我想添加新活动:

INSERT INTO users_activity (userId, date) VALUES(19, "2016-04-06")

UPDATE users SET last_activity = "2016-04-06" WHERE id = 19 LIMIT 1

如果我想取消last_activity

DELETE FROM users_activity WHERE activity_id = 100 LIMIT 1

SELECT date FROM users_activity WHERE userId = 19 ORDER BY DESC LIMIT 1

使用此选择,我能够获取FROM users_activity表的最后日期并在update sql中使用它。

UPDATE users SET last_activity = "2016-04-02" WHERE id = 19 LIMIT 1

第二种选择:

我从users表中删除了列last_activity并选择如下:

SELECT
  users.*,
  users_activity.date
FROM
   users
LEFT JOIN
   users_activity ON users_activity.userId = users.id
GROUP BY users.id
ORDER BY
   users.id DESC, users_activity.date DESC
LIMIT 0, 10

如果我想添加新活动:

INSERT INTO users_activity (userId, date) VALUES(19, "2016-04-06")

如果我想取消last_activity

DELETE FROM users_activity WHERE activity_id = 100 LIMIT 1

我用的是Mysql。 这两个表都是innoDB

在这种情况下,你会以哪种方式推荐我?为什么?

您想要使用第二个场景,两个表。 这样您就不必担心管理上一个活动日期以及活动列表,并且您可以通过选择每个用户的max(users_activity_date)以及每个用户的左连接和分组来获取最后一个活动日期。

作为免责声明,您可能希望尝试这两种方法,并在您的情况下查看哪些方面更具效果。 方案1为报告查询提供了性能优势,但方案2将为活动跟踪更新性能点头。 对于任何性能问题,没有最佳实践或建议可以真实地用实际负载替换您环境中的测试。

首先,我想说你的insert语句语法是错误的。 因为insert语句不适用于where子句。 如果我理解你正确,你想要显示用户的信息,这是最后一次行动日期。 如果你的表索引良好,你可以在下一个查询中执行:

SELECT u.*, a.action_date FROM users u
LEFT JOIN users_activity a ON a.userId = u.userId
GROUP BY a.userId
ORDER BY a.action_date desc
LIMIT 0, 10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM