php - Laravel/PHP/MySQL - 每小时与成千上万的用户一起存储/记录数据的最佳方式?

标签 php mysql database laravel

我正在运行一个用于展示、跟踪和管理加密货币投资的平台。 该网站建立在 laravel 框架之上,我们的数据库使用 MySQL。

目前,我们在很短的时间内就拥有了超过 5800 名用户,因此我们正在努力扩大每天获得的大量用户。

我们目前想要做的是有一个页面,您可以在其中查看您的投资组合的统计信息,我们想要添加的第一件事是过去 7 天的投资组合净值变化。

每个投资组合都是用我们称之为“投资”的东西构建的,您真正需要了解的是,在数据库中,所有投资都有自己的行,说明购买的金额、购买时的价格以及它是什么货币。

每个用户都有 1-1000 多个投资。

现在我们想开始每天甚至每小时记录他们的净 Assets (所有投资加在一起),但我担心的是遍历所有 5800 名用户和数据库中的所有 80K+ 投资并为每一天创建一个新行/hour 每个用户将花费很长时间或效率不高。

最好的方法是什么?我考虑的不是遍历数据库,而是每次访问您的投资组合时它都会在数据库中生成一行,但话又说回来,如果您访问一天然后跳过一天,我们就会错过一天。

我希望我对此解释得足够好,我很想听听您如何解决这个问题。

TLDR:我们有 6K~ 用户,并且希望每小时/每天记录他们的净 Assets 使用另一个包含他们投资的表(大约 80K 投资)。

最佳答案

我不建议存储计算机值。这只是一种不好的做法,是的,这可能会提高性能,但我认为您目前可能什么都不担心。

  1. 确保您已使用正确的索引正确设置您的表 等等

  2. 然后确保您编写的 SQL/Eloquent 查询是最佳的 尽可能计算 DB 的每个时间增量的利润/损失 水平不是代码。

  3. 在适当的位置加载/计算每个配置文件 View 上的数据 不应该是那个处理器饿了。您可以缓存结果 如果您的用户群增加,则在特定时间段内 我确定 Stack-overflow 会。

我根据经验写这篇文章。我有一张表格,其中包含 7 年时间范围内的 1000 万条记录。根据这些数据,我根据点击的每个时间增量在时间范围之间填充了一个图表。这些时间框架是动态的,时间增量也是动态的(小时/天/周/月/年)。即使我请求在整个 7 年期间绘制的所有 1000 万条记录,它自己的 SQL 也需要 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 个)加水是一个完整的资源 killer ,完全没有必要。以数组形式检索结果要友好得多。

更新以解决评论中的问题:

索引 可能被 Laravel/Eloquent 本身很好地涵盖了,但通常您希望确保索引存在于您打算通过 WHERE column = ' 查询的整数列和 varchar 列上' 但是,如果查询将是 WHERE column LIKE = '%%',那么索引就会浪费,请在此处查看 Laravel 架构构建器文档的起点:https://laravel.com/docs/5.0/schema

缓存,同样由 Laravel 很好地处理,你会想要根据你的特定需求调整设置,但这里是文档作为起点:https://laravel.com/docs/5.4/cache

就查询内的计算而言,我通常会尝试确保任何可能进入查询的东西都会执行,而不是在应用程序级别执行。通常(不总是)如果这是 SQL 可以 做的事情,它在 SQL 中会比在 PHP 中更快。尤其是数字的计算,比如你想要的。带有 GROUP BY (date)sum(profit) 将近乎即时,并且在试图获得相同结果的 PHP 中需要更少的循环。例如,如果您以我为例。您的绘图逻辑将需要 1643 次循环迭代而不是几百万次,因为每天只返回结果总数而不是所有结果。

关于php - Laravel/PHP/MySQL - 每小时与成千上万的用户一起存储/记录数据的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45187871/

相关文章:

php - Codeigniter 中不允许使用关键字符

php - 如何从中间件向 Laravel 的 IOC 容器添加对象

android - 我正在做一项作业,我必须在其中创建只读的 sqlite 数据库,而不会提示用户输入数据。

c# - 无法在 mysql 中添加外键约束

javascript - 带有 Ratchet 的 PHP WebSockets - 示例不起作用

php - 在 Silex 中检测环境类型(生产、开发或暂存)

mysql - 相关查询 - 在派生表中,我可以有很多嵌套级别吗?

mysql - SQL:对结果列表运行嵌套查询

mysql - 从两个不同的行中为单个名称选择两个值

PHP/MySQL : Path Error: [function. require]:无法打开流: