我正在运行一个展示,跟踪和管理加密货币投资的平台。 该网站建立在laravel框架之上,我们将MySQL用于我们的数据库。
目前我们在很短的时间内拥有超过5800名用户,因此我们正努力与每天都有大量用户进行扩展。
我们目前想要做的是建立一个页面,您可以在其中查看投资组合的统计数据,我们想要添加的第一件事是过去7天内投资组合的净值变化。
每个投资组合都是建立在我们称之为"投资"所有你真正需要知道的是,在数据库中,所有投资都有自己的行,说明购买的金额,购买时的价格以及它是什么货币。
每位用户都有1-1000多次投资。
现在我们想要每天甚至每小时开始记录他们的净值(所有投资加在一起),但我担心的是循环遍历所有5800个用户和数据库中的所有80K +投资并为每天创建一个新行每个用户/小时需要很长时间或不高效。
最好的方法是什么?我想的是不是循环访问数据库,每次访问你的投资组合时,它都会在数据库中排成一排,但如果你一天访问然后跳过一天,我们就会错过一天。
我希望我能够很好地解释这一点,我很乐意听到你如何解决这个问题。
TLDR:我们有6K用户,他们希望每小时/每天记录他们的净资产使用另一张有投资的表(约80K投资)。
答案 0 :(得分:1)
我不建议存储计算机值。这只是不好的做法,是的,可能会提高性能,但我认为你现在可能不会担心任何事情。
确保使用正确的索引正确设置了表格 等
然后确保您已将SQL / Eloquent查询编写为最佳 尽可能计算DB处每个时间增量的利润/损失 级别不是代码。
在此处加载/计算每个配置文件视图上的数据 不应该是那个渴望处理器的人。您可以缓存结果 某个时间段,如果您的用户群增加了什么 我确定Stack-overflow确实存在。
我是根据经验写的。我在7年的时间内获得了一张有1000万条记录的表格。根据这些数据,我根据每个时间增量命中的时间范围填充图表。这些时间帧是动态的,时间增量(小时/天/周/月/年)也是动态的。即使我要求在整个7年期间内绘制所有1000万条记录,它自己需要 0.1s 这是SQL转储,以显示它不仅仅是一些简单的查询(按日期时间跨度(天)分组):
Showing rows 0 - 29 (1643 total, Query took 0.1214 sec)
SELECT
DATE(FROM_UNIXTIME(p0_.timestamp)) AS sclr0,
count(p0_.timestamp) AS sclr1,
p0_.id AS id2,
-- A lot more select-columns here
FROM prod_contacts.cms_actions p0_
LEFT JOIN prod_contacts.cms_contacts p1_ ON p0_.contactid = p1_.id
WHERE p1_.clientnumber IS NOT NULL
AND p0_.notes LIKE ?
AND (p0_.timestamp BETWEEN ? AND ?)
AND p0_.user IN (?)
GROUP BY sclr0
ORDER BY p0_.timestamp ASC
重要:我遇到的一个问题(我使用Doctrine而不是Eloquent)最初保湿所有10M对象(每条记录1个)是一个完全的资源杀手,完全没必要。以数组的形式检索结果远非友好。
索引可能很好地涵盖了Laravel / Eloquent本身,但通常您希望确保整数列和varchar列上存在索引,您打算通过WHERE column = ''
进行查询。如果查询将WHERE column LIKE = '%%'
检查Laravel架构生成器文档中的起点,则会浪费索引:https://laravel.com/docs/5.0/schema
缓存,再次由Laravel处理得很好,您需要调整设置以满足您的特定需求,但这里以文档为起点:https://laravel.com/docs/5.4/cache
就查询中的计算而言,我通常会尝试确保可能进入查询的任何内容,而不是在应用程序级别执行此操作。通常(并非总是)如果它是SQL CAN 所做的事情,它在SQL中比在PHP中更快。特别是数字的计算,例如你想要的。具有sum(profit)
的{{1}}将接近即时,并且在PHP中需要较少的循环以尝试获得相同的结果。举个例子,举个例子。您的绘图逻辑将需要1643次循环迭代而不是数百万次,因为每天只返回结果总数而不是所有结果。
答案 1 :(得分:0)
因此,您希望开始在事务数据之上构建数据仓库。
首先,我认为这不会对您的数据库产生如此大的影响。无需循环,您可以使用insert ... select ...
计算每小时摘要并将它们插入到每小时统计表中。对于用户ID和时间使用适当的多列索引,这不应该是一个问题。每日统计表应该总结每小时统计表中的数据。
其次,如果您仍然担心性能,或者这些统计表只是您计划创建的许多表中的第一个,那么我将使用不同的mysql实例(甚至是不同的服务器)来存放统计表。配置mysql以将事务复制到辅助数据库并在那里创建统计信息表。