Laravel/PHP/MySQL—每小时存储/记录数千用户数据的最佳方式?
我正在运行一个展示、跟踪和管理加密货币投资的平台。 该网站建立在laravel框架之上,我们使用MySQL作为数据库 目前,我们在很短的时间内拥有5800多个用户,因此我们正努力扩大我们每天获得的大量用户 我们目前想要做的是有一个页面,你可以看到你的投资组合的统计数据,我们想添加的第一件事是投资组合净值在过去7天的变化 每个投资组合都是用我们称之为“投资”的东西构建的。您真正需要知道的是,在数据库中,所有投资都有自己的行,说明购买的金额、购买时的价格以及它是什么货币 每个用户都有1-1000+项投资 现在我们想开始每天甚至每小时记录他们的净资产(所有投资加在一起),但我担心的是,通过所有5800个用户和数据库中的所有80K+投资循环,并为每个用户每天/小时创建一个新行需要很长时间,或者效率不高 最好的方法是什么?我在想,不要在数据库中循环,每次你访问你的投资组合时,它都会在数据库中划一行,但是,如果你访问一天,然后跳过一天,我们会错过一天 我希望我解释得足够好,我很想听到你如何解决这个问题Laravel/PHP/MySQL—每小时存储/记录数千用户数据的最佳方式?,php,mysql,database,laravel,Php,Mysql,Database,Laravel,我正在运行一个展示、跟踪和管理加密货币投资的平台。 该网站建立在laravel框架之上,我们使用MySQL作为数据库 目前,我们在很短的时间内拥有5800多个用户,因此我们正努力扩大我们每天获得的大量用户 我们目前想要做的是有一个页面,你可以看到你的投资组合的统计数据,我们想添加的第一件事是投资组合净值在过去7天的变化 每个投资组合都是用我们称之为“投资”的东西构建的。您真正需要知道的是,在数据库中,所有投资都有自己的行,说明购买的金额、购买时的价格以及它是什么货币 每个用户都有1-1000+项
TLDR:我们有6K~用户,希望使用另一个有他们投资的表(约8万个投资)每小时/天记录他们的净资产。因此,您希望开始在事务数据之上构建一个数据仓库 首先,我不认为这会对数据库的性能产生如此大的影响。不需要循环,您可以使用
insert。。。选择…
计算小时汇总并将其插入小时统计表。在用户ID和时间上有适当的多列索引,这应该不是问题。每日统计表应该汇总每小时统计表中的数据
其次,如果您仍然担心性能,或者这些统计表只是您计划创建的许多统计表中的第一个,那么我将使用不同的mysql实例(甚至不同的服务器)来存放统计表。配置mysql将事务复制到辅助数据库,并在那里创建stats表。我不建议存储计算机值。这只是一种不好的做法,是的,这可能会提高绩效,但我认为你现在可能什么都不担心
WHERE column='
进行查询,但是如果查询是WHERE column LIKE='%%',
请检查此处的Laravel的schema builder文档的起点:
缓存,同样由Laravel很好地处理,您需要根据自己的具体需要调整设置,但以下是文档作为起点:
就查询中的计算而言,我通常会尝试确保任何可能进入查询的内容都可以进行计算,而不是在应用程序级别进行计算。通常(并非总是)如果这是SQL可以做的事情,那么在SQL中比在PHP中更快。特别是对数字的计算,就像你想的那样。一个
sum(price)
和一个groupby(date)
几乎是即时的,在PHP中需要更少的循环来获得相同的结果。以我为例。您的绘图逻辑将需要1643次循环迭代,而不是几百万次,因为每天只返回结果总数,而不是所有结果 你到底有什么问题?循环数据库获取数据是否会降低系统速度?收集所有信息是否花费太多时间?我在我们的一个系统中遇到过类似的问题。我们通过为每个客户添加一个只读副本来“修复”这个问题。首先要回答的问题是,您希望在什么时间间隔内向客户提供数据,以及您希望以什么方式向他们显示数据。嘿!非常感谢您非常详细的回答。在如此大的规模(不是很大,但对我来说它是巨大的!)工作对我来说是新的,我从来没有想过会有超过100人注册,所以很多这些东西对我来说都是新的。所以你认为计算是最明智的
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