0

我在我的网站上存储了一些历史信息,以便将来检索用户。因此,当他们访问某些页面时,它将记录他们访问的页面、时间,然后将其存储在他们的用户 ID 下以供将来添加/检索。

所以我最初的计划是将所有数据存储在一个数组中,然后在每次检索时对其进行序列化/反序列化,然后将其存储回数据库的 TEXT 字段中。问题是:如果用户建立(例如)10k 页的历史记录,我不知道这对于大量数据会有多有效或低效。

编辑:所以我想知道最有效的方法是什么?我还考虑在数据库中为每条历史记录插入一个新行,但这会成为一个用于从中选择内容的大型数据库。

问题是什么是更快/高效、数据库中的大量行或大量序列化数组?显然欢迎任何其他更好的解决方案。我最终会切换到 Python,但现在这必须在 PHP 中完成。

4

2 回答 2

2

将数据存储为序列化数组没有任何好处。检索大量数据、反序列化、修改它并重新序列化以进行更新很慢 - 更糟糕的是,数据块越大(正是你担心的)会变得越慢。

数据库是专门为处理大量行而设计的,因此请使用它们。与您提出的方法不同,随着数据的增长,您每次插入都没有额外的成本,并且您仍然存储相同数量的数据,因此让数据库做它最擅长的事情,并保持您的代码简单。

将数据存储为数组也使得任何类型的查询和聚合几乎是不可能的。如果系统的目的是(例如)查看特定页面获得了多少次访问,则您必须对每条记录进行反序列化,查找所有匹配的页面等。如果您将数据作为一系列行用户和页面,这是一个简单的 SQL 计数查询。

如果有一天,您发现您有太多行(10,000 行并不是很多行)以至于您开始看到性能问题,请找到优化它的方法,也许是通过聚合和反规范化。

于 2012-07-14T07:59:28.057 回答
0

您可以检查会话变量并存储一个会话的所有数据,并将其一起转储到数据库中。

您可以在数据库级别进行索引以节省时间。

最后也是最有效的事情是对数据进行操作/操作并将其存储在单独的表中。并且始终从手动表中选择数据。您可以使用 cron 作业或一些计划来实现这一点。

于 2012-07-14T07:58:13.657 回答