Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel/PHP/MySQL—每小时存储/记录数千用户数据的最佳方式?_Php_Mysql_Database_Laravel - Fatal编程技术网

Laravel/PHP/MySQL—每小时存储/记录数千用户数据的最佳方式?

Laravel/PHP/MySQL—每小时存储/记录数千用户数据的最佳方式?,php,mysql,database,laravel,Php,Mysql,Database,Laravel,我正在运行一个展示、跟踪和管理加密货币投资的平台。 该网站建立在laravel框架之上,我们使用MySQL作为数据库 目前,我们在很短的时间内拥有5800多个用户,因此我们正努力扩大我们每天获得的大量用户 我们目前想要做的是有一个页面,你可以看到你的投资组合的统计数据,我们想添加的第一件事是投资组合净值在过去7天的变化 每个投资组合都是用我们称之为“投资”的东西构建的。您真正需要知道的是,在数据库中,所有投资都有自己的行,说明购买的金额、购买时的价格以及它是什么货币 每个用户都有1-1000+项

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

目前,我们在很短的时间内拥有5800多个用户,因此我们正努力扩大我们每天获得的大量用户

我们目前想要做的是有一个页面,你可以看到你的投资组合的统计数据,我们想添加的第一件事是投资组合净值在过去7天的变化

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

每个用户都有1-1000+项投资

现在我们想开始每天甚至每小时记录他们的净资产(所有投资加在一起),但我担心的是,通过所有5800个用户和数据库中的所有80K+投资循环,并为每个用户每天/小时创建一个新行需要很长时间,或者效率不高

最好的方法是什么?我在想,不要在数据库中循环,每次你访问你的投资组合时,它都会在数据库中划一行,但是,如果你访问一天,然后跳过一天,我们会错过一天

我希望我解释得足够好,我很想听到你如何解决这个问题


TLDR:我们有6K~用户,希望使用另一个有他们投资的表(约8万个投资)每小时/天记录他们的净资产。

因此,您希望开始在事务数据之上构建一个数据仓库

首先,我不认为这会对数据库的性能产生如此大的影响。不需要循环,您可以使用
insert。。。选择…
计算小时汇总并将其插入小时统计表。在用户ID和时间上有适当的多列索引,这应该不是问题。每日统计表应该汇总每小时统计表中的数据


其次,如果您仍然担心性能,或者这些统计表只是您计划创建的许多统计表中的第一个,那么我将使用不同的mysql实例(甚至不同的服务器)来存放统计表。配置mysql将事务复制到辅助数据库,并在那里创建stats表。

我不建议存储计算机值。这只是一种不好的做法,是的,这可能会提高绩效,但我认为你现在可能什么都不担心

  • 确保已使用正确的索引正确设置表 等等

  • 然后确保您已将SQL/雄辩的查询编写为最佳查询 尽可能以DB计算每次时间增量的损益 级别不是代码

  • 在该位置加载/计算每个纵断面图上的数据 那个处理器不应该饿。您可以将结果缓存到 如果你的用户群增加了,在一定的时间段内 我相信堆栈溢出确实会

  • 我是根据经验写的。我有一张表,在7年的时间范围内有1000万条记录。根据这些数据,我根据每个时间增量的命中率在时间框架之间填充了一个图表。这些时间框架是动态的,时间增量(小时/天/周/月/年)也是动态的。即使我请求在整个7年期间绘制的所有1000万条记录,其自身所需的SQL0.1s这是SQL转储,以表明它也不仅仅是一些简单的查询(按日期时间跨度(天)分组):

    重要:我有一个问题(我使用的理论没有说服力)最初对所有10万个对象(每个记录1个)进行水合是一个完全的资源杀手,完全没有必要。以数组形式检索结果要友好得多

    更新以解决评论中的问题: 索引可能被Laravel/Eloquent本身很好地覆盖,但通常您希望确保在整数列和varchar列上存在索引,您打算通过
    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