【问题标题】:Fastest way to store table of data and retrieve存储数据表和检索的最快方法
【发布时间】:2012-07-13 23:37:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您需要一些关于页数和时间的上限。否则,使用像 SVN 这样的 summat 并即时生成 id。
  • 我猜你从来没有打算在用户的历史页面中显示 10k 的数据。显示 20 行历史记录,并放置“更多”链接以向页面添加更多数据。对于 Facebook 的时间线配置文件,它会在您向下滚动页面时添加更多数据,而不是一次添加所有数据。

标签: php mysql database arrays serialization


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    数据库是专门为处理大量行而设计的,因此请使用它们。与您建议的方法不同,随着数据的增长,每次插入不会产生额外费用,并且您仍然存储相同的 数量 数据,因此让数据库做它最擅长的事情,并保留您的代码很简单。

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

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

    【讨论】:

    • 嗯...这可能会增长到每周十万,甚至可能在几个月内更多。我一次只能抓取 30 个,并根据请求加载它们,并通过用户 ID 选择并按时间排序。那么很明显,当有数百万条记录时,这会减慢速度?还是不行?
    • 为什么需要在每次点击时加载用户的完整历史记录?
    • 我不会。我说我会抓取 30 行并根据要求加载更多(比如点击一个按钮说“加载更多”)但是所有这些信息都将为成千上万的用户存储......
    • 哦,我现在明白了。不,只要您的表格设计正确(例如,带有索引),差别不大。毕竟,这正是数据库的设计初衷。
    • 真的吗?我研究了哈希表(我认为这是数据库的基础),但我从来不明白它是如何获取数据的,例如:SELECT * FROM users WHERE uid = 10;如果它被索引,uid 的值是否会散列到后端的其他东西?就像我在散列算法中插入 10 然后它找到正确的键来定位行?只是想了解所有这些是如何工作的。我知道当表中有太多数据时必须进行重新散列,但不知道这如何扩展到数百万行。
    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多