php - 使用 PHP MySQL 的事件提要

标签 php mysql performance feed

我正在使用 PHP 和 MySQL 制作某种“事件流/提要”。

我有一个流表,它只存储事件的类型和时间戳。然后我需要查找可以在各种表中找到的事件的实际数据(取决于事件类型)。该流应该能够处理数百个用户,因此我需要它表现良好。我得到的选项:

  • 获取流表 - 使用某种开关在 PHP 中循环,然后调用 SQL 获取适当的事件数据(针对每个事件)。 (慢)
  • 用一些连接创建一个大的 SQL 语句,在一个请求中获取所有事件数据。仍然在 PHP 中进行切换,但不必再次调用 SQL。 (这对大 table 来说很慢吗?)
  • 在 MySQL 中使用某种 View - 我以前没有这样做过。
  • 使用多个 SQL 调用获取所有事件数据并将它们存储在 PHP 数组中,然后从那里进行切换。

我还有其他选择吗?就性能而言,最佳方法是什么?

最佳答案

您可以使用单个查询执行数据驱动的JOIN。本质上,您将JOIN 每个需要的子表,然后通过别名从您需要的表中选择内容。假设 1 是 activity_drink,2 是 activity_eat,3 是 activity_sports 并且所有子表都有您要获取的列 content:

SELECT a.`timestamp`,
    CASE a.`activity_type`
        WHEN 1 THEN ad.`content`
        WHEN 2 THEN ae.`content`
        WHEN 3 THEN asp.`content`
    END AS content
FROM activities AS a
LEFT JOIN activity_drink AS ad ON (ad.`activity_id` = a.`activity_id`)
LEFT JOIN activity_eat AS ae ON (ae.`activity_id` = a.`activity_id`)
LEFT JOIN activity_sports AS asp ON (asp.`activity_id` = a.`activity_id`)

这基本上会在选定时间对您的表进行非规范化。您也可以将其转换为 VIEW为了便于访问。它不应该太昂贵,假设你已经正确设置了外键、ID 和/或 UNIQUE 索引(MySQL 会注意到表中没有匹配的行并“忽略它”——选择 NULL排)。我还没有完全正确地测试它,因为我缺少任何数据并且不得不假设,但该代码段应该基本上可以正常运行。

但是,我想提一下,我个人对必须进行数据驱动的联接持谨慎态度。在这种情况下进行规范化的正确方法是找到最大的公共(public)属性集并将它们放入 activities 表中。如有必要,您可以将额外信息添加到相邻的表格中。但是,一般来说,如果多个表使用相同的数据,您应该将其移到主列中,除非绝对有必要不这样做。

关于php - 使用 PHP MySQL 的事件提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7445122/

相关文章:

php - Laravel orderBy whereHas

php - 如何在 WooCommerce 数据库中找到客户订购的产品?

asp.net - 使用多个子域会加快我的网站速度吗?

php - 使用 PHP 删除字符串的一部分

r - 随着数据框变大,如何防止 rbind() 变得非常慢?

asp.net-mvc-3 - 从 EF 迁移到 Fluent NHibernate : Memory Leaks, 架构

php - SQLSTATE[HY093] : Invalid parameter number: parameter was not defined : PHP PDO Object

javascript - 单击 anchor 标记时淡入和淡出

mysql - SQL 查询返回 Sum 和 Count 的错误值

mysql - 如何在 MySQL 中添加多于一列同时也将删除重复项?