gpt4 book ai didi

php - Laravel 5.5 优化查询

转载 作者:行者123 更新时间:2023-12-01 08:48:59 27 4
gpt4 key购买 nike

我对每次从数据库检索数据时减少数据库连接有疑问。我假设我有 5 个表(通知、订单、用户、产品、交易)

在仪表板中,我必须显示:

  • 未读通知
  • 订单统计
  • 产品数量
  • 交易统计

  • 对于最简单的方法(伪代码):
    $notis = Notification::where('unread')->get();
    $orderStat = Order::join('user')->where('count(order.id)', 'status')->groupby('status');
    $product = Product::count();
    $transactions = Transaction::join('user')->where('count(trans.id)', 'status')->groupby('status');

    所以我必须运行 4 个单独的查询,正如我的导师所说,如果每个表中有 许多记录 或仪表板 需要更多表(不用于加入) 来查询,则此解决方案将减少服务器的语音。
    我已经做了:
  • 外键列索引
  • 急切加载 eloquent(如果可用)
  • (或在 UI 呈现后使用 ajax 加载数据)

  • 请问: 对于上述情况,有没有其他方法可以减少处理时间?
    还有其他关于 connection pool 的问题,他说用它来提高速度。研究了下发现 Laravel 已经做了连接池了,不是吗?
    编辑:
    用户有很多通知、订单、交易。
    我只是想问上面没有提到的提高性能的方法。

    最佳答案

    首先更正你的伪代码,它应该是这样的:

    $notis = Notification::where('unread')->get();
    $orderStat = Order::join('user')->select('count(order.id)', 'status')->groupBy('status');
    $product = Product::count();
    $transactions = Transaction::join('user')->select('count(trans.id)', 'status')->groupBy('status');

    我有一些额外的提示,您可以考虑:

    1) 不要使用查询缓存(查询缓存从 MySQL 5.7.20 开始被弃用,并在 MySQL 8.0 中被移除。)

    2) 使用 InnoDB 作为表和 SQL Server 缓冲池的存储引擎来提高容量 - https://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html

    3)如果可能不从查询中获取所有记录,请使用 LIMIT 和 OFFSET 来缩小数据范围(Laravel 中的限制和跳过方法或仅分页)

    4)如果你不需要用户数据,不要使用带有用户表的INNER JOIN(如果每个交易和订单总是有用户)

    5) 使用 ab http://httpd.apache.org/docs/2.2/programs/ab.html 测试请求以正确设置您的服务器

    6) 使用 php >= 7.0 with fpm 和 opcache 会增加请求的限制

    7) 使用 Cache API https://laravel.com/docs/5.5/cache 存储查询结果(如果数据更改,则更新缓存)

    8) 使用 https://github.com/barryvdh/laravel-debugbar 分析您的查询

    关于php - Laravel 5.5 优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879431/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com