我有一个创建日志的程序,这些日志用于计算每个客户的余额,趋势等。目前,我将所有内容存储在单独的MYSQL表中。我通过连接两个表将所有日志链接到特定客户端。当我访问客户端时,它会从log_table中提取所有日志并生成报告。该报告取决于具体的过滤器,主要是日期和类别。
我关注的是我的程序的性能,因为我们积累了更多的日志和客户端。我的直觉告诉我将日志信息以序列化数组的形式存储在user_table中,因此整个会话只使用一个查询。然后我可以使用该日志数组并使用PHP过滤它,如前所述,它在MYSQL查询中过滤(使用多种方法,例如BETWEEN用于日期和其他比较)。
我的问题是,如果我使用序列化数组存储日志而不是使用MYSQL表存储每个单独的日志,您认为性能会提高吗?我们估计每个客户大约有500-1000个日志,大约有50000个客户(并且还在增长)。
答案 0 :(得分:0)
听起来你并不了解是什么让数据库变得强大。它不是关于"存储数据"它关于"以可被索引,优化和过滤的方式存储数据"。您不会存储序列化数组,因为数据库无法执行任何操作。它看到的只是一个单独的字符串,没有任何可以有意义地使用的结构。以这种方式使用它会使整个原因无法使用数据库。
相反,找出阵列数据的架构,然后正确插入数据,每个专用表列有一个字段,这样您就可以实际使用数据库作为数据库,允许它优化其存储,检索和数据库代数(选择,加入和过滤)。
另外,这部分很重要,这意味着您的数据库可以在任何地方生活,包括在您的网络服务器旁边的更快的机器上,这样您的数据库就可以在0.1秒内返回结果,而不是PHP顶级100%cpu来过滤您的数据,并阻止您的网站用户获取页面结果,因为您阻止了所有线程。实际上,由于这个原因,将此任务保留在PHP中完全没有意义,即使您在实现模式和查询方面做得不好,忘记缓存结果并在这些缓存结果中进行后续搜索,忘记索引列上的表以便快速检索等等。
PHP不是为了完成所有繁重的工作。它应该询问其他所需的数据,并充当"请求进入","获得响应基础数据"并且"响应被发送回客户端"。它应该启动,进行调用,生成结果,并尽可能快地死亡。
答案 1 :(得分:0)
这实际上取决于您需要如何使用数据。如果您不需要搜索该数据,您可能需要考虑使用mongo进行存储。如果这样做,请将其保留在单独的行中,并以使其快速查找的方式创建索引。
如果您有100亿行,并且需要查找其中的100行来进行计算,那么如果您的索引正确完成,它仍应该很快。
现在,如果您有100亿行,并且想要对其中的10,000行进行求和,那么在某处保存该总数可能会更有效。每当添加,删除或更新会影响该总计的新行时,您也可以更改该总计。考虑一个银行,其中分类账中的所有项目都存储在一个表格中,但余额存储在用户帐户中,并且不是每次用户想要检查其余额时都根据所有交易计算的。