是否加入另一个 table?
Joining to another table or not?
基本上我有2个table。 users
和 users_activity
。我用mysql table 用户数差不多5000。每个用户有很多活动,大约50-150个活动。当我想获取用户列表 table(十乘十)时,我必须显示用户的最后一个 activity 日期。在这种情况下,我有两个选择:
第一个选项:
我将列 last_activity
添加到 users
table 并像这样 select :
SELECT * FROM users ORDER BY id DESC, lIMIT 0, 10
如果我想添加一个新的activity:
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
使用这个 select,我能够从 users_activity
table 中获取最后一个日期并在更新 sql.
中使用它
UPDATE users SET last_activity = "2016-04-02" WHERE id = 19 LIMIT 1
第二个选项:
我从 users
table 中删除列 last_activity
并像这样 select :
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
如果我想添加一个新的activity:
INSERT INTO users_activity (userId, date) VALUES(19, "2016-04-06")
如果我想取消 last_activity
:
DELETE FROM users_activity WHERE activity_id = 100 LIMIT 1
我用Mysql。 table 都是 innoDB
.
在这种情况下,你会推荐我哪种方式,为什么?
您想使用第二个场景,两个表。这样您就不必担心管理最后一个 activity 日期以及 activity 列表,并且您始终可以通过选择 max(users_activity_date) 每个用户与每个用户的左连接和分组。
作为免责声明,您可能想同时尝试这两种方法,看看哪种方法更适合您的情况。方案 1 为您的报告查询提供性能优势,但方案 2 将为 activity 跟踪更新提供性能点头。对于任何性能问题,没有任何最佳实践或建议可以真正用实际负载代替您环境中的测试。
首先我想说你的插入语句语法是错误的。因为 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
基本上我有2个table。 users
和 users_activity
。我用mysql table 用户数差不多5000。每个用户有很多活动,大约50-150个活动。当我想获取用户列表 table(十乘十)时,我必须显示用户的最后一个 activity 日期。在这种情况下,我有两个选择:
第一个选项:
我将列 last_activity
添加到 users
table 并像这样 select :
SELECT * FROM users ORDER BY id DESC, lIMIT 0, 10
如果我想添加一个新的activity:
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
使用这个 select,我能够从 users_activity
table 中获取最后一个日期并在更新 sql.
UPDATE users SET last_activity = "2016-04-02" WHERE id = 19 LIMIT 1
第二个选项:
我从 users
table 中删除列 last_activity
并像这样 select :
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
如果我想添加一个新的activity:
INSERT INTO users_activity (userId, date) VALUES(19, "2016-04-06")
如果我想取消 last_activity
:
DELETE FROM users_activity WHERE activity_id = 100 LIMIT 1
我用Mysql。 table 都是 innoDB
.
在这种情况下,你会推荐我哪种方式,为什么?
您想使用第二个场景,两个表。这样您就不必担心管理最后一个 activity 日期以及 activity 列表,并且您始终可以通过选择 max(users_activity_date) 每个用户与每个用户的左连接和分组。
作为免责声明,您可能想同时尝试这两种方法,看看哪种方法更适合您的情况。方案 1 为您的报告查询提供性能优势,但方案 2 将为 activity 跟踪更新提供性能点头。对于任何性能问题,没有任何最佳实践或建议可以真正用实际负载代替您环境中的测试。
首先我想说你的插入语句语法是错误的。因为 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