【问题标题】:PHP array VS MSQL tablePHP 数组 VS MSQL 表
【发布时间】:2014-11-23 16:30:33
【问题描述】:

我有一个创建日志的程序,这些日志用于计算每个客户的余额、趋势等。目前,我将所有内容存储在单独的 MYSQL 表中。我通过加入这两个表将所有日志链接到特定客户端。当我访问客户端时,它会从 log_table 中提取所有日志并生成报告。该报告会因使用的过滤器而异,主要是针对特定日期和类别。

我担心的是我的程序的性能,因为我们积累了更多的日志和客户端。我的直觉告诉我将日志信息以序列化数组的形式存储在 user_table 中,因此整个会话只使用一个查询。然后,我可以获取该日志数组并使用 PHP 对其进行过滤,与以前一样,它在 MYSQL 查询中进行过滤(使用多种方法,例如 BETWEEN 用于日期和其他比较)。

我的问题是,如果我使用序列化数组来存储日志而不是使用 MYSQL 表来存储每个单独的日志,您认为性能会提高吗?我们估计每个客户端大约有 500-1000 个日志,其中大约有 50000 个客户端(并且还在增长)。

【问题讨论】:

  • 您意识到您可以使用单个 SQL 查询检索多个数据库表的一行......问题是您正在使用多个表,而您应该使用单个表
  • 我不确定我是否理解。在这种情况下,我使用两个表,client_table 和 log_table。 client_table 有一个 ID,用于将每个单独的日志链接到相应的客户端。我希望这是有道理的。
  • 我想我误解了....我以为您为每个客户使用单独的日志表
  • 但是,如果您不采用序列化数据的方法,并在 PHP 中进行所有过滤,性能将迅速下降...... SQL 查询中的过滤正在使用正确的工具来完成这项工作,因为只要你的表被合理索引
  • 两张表有什么索引?您现在使用什么查询来检索日志数据?该查询的 EXPLAIN 显示了什么?

标签: php mysql arrays performance


【解决方案1】:

听起来您不明白是什么让数据库变得强大。这不是关于“存储数据”,而是关于“以可以索引、优化和过滤的方式存储数据”。您不存储序列化数组,因为数据库对此无能为力。它所看到的只是一个字符串,没有任何可以有意义地使用的结构。以这种方式使用它会使使用数据库的全部理由无效。

相反,找出数组数据的架构,然后正确插入数据,每个专用表列有一个字段,这样您就可以真正将数据库用作数据库,使其能够优化其存储、检索和数据库代数(选择、加入和过滤)。

  • 数据库中的序列化数组是否比原生 PHP 更快?不,当然不。您已强制数据库充当平面文件,并产生额外的 dbms 开销。
  • 正确使用数据库是否比原生 PHP 更快?通常,是的,很多。

另外,这部分很重要,这意味着您的数据库可以存在于“任何地方”,包括在您的网络服务器旁边更快的机器上,这样您的数据库可以在 0.1 秒内返回结果,而不是 PHP 占用 100% cpu过滤您的数据并阻止您网站的用户获取页面结果,因为您阻止了所有线程。事实上,出于这个原因,将这个任务保留在 PHP 中绝对没有意义,即使您不擅长实现架构和查询,忘记缓存结果并在这些缓存结果中进行后续搜索,忘记索引列上的表格,用于极快的检索等。

PHP 不适合做所有繁重的工作。它应该向其他事物询问它需要的数据,并充当“请求进来”、“获得响应基础数据”和“将响应发送回客户端”之间的粘合剂。它应该启动、调用、生成结果,然后尽快死掉。

【讨论】:

    【解决方案2】:

    这实际上取决于您需要如何使用数据。如果您不需要搜索该数据,您可能需要考虑使用 mongo 进行存储。如果这样做,请将其保留在单独的行中,并以使它们快速查找的方式创建索引。

    如果您有 100 亿行,并且需要查找其中的 100 行来进行计算,如果您的索引正确完成,它应该仍然很快。

    现在,如果您有 100 亿行,并且想要对其中的 10,000 行求和,那么将总数保存在某个地方可能会更有效。每当添加、删除或更新会影响该总计的新行时,您也可以更改该总计。考虑一家银行,账本中的所有项目都存储在一个表中,但余额存储在用户帐户中,并且不是根据用户每次想要查看余额时的所有交易来计算的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多