Laravel 5.5优化查询

问题描述 投票:2回答:3

我有问题,每次从数据库中检索数据时都会减少数据库连接。我假设我有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个单独的查询,因为我的导师说如果每个表中有很多记录或者仪表板需要更多的表(不是用于加入)来查询,这个解决方案会减少服务器的语音。 我已经做了:

  • 外键列索引
  • 如果可用的话,渴望加载雄辩
  • (或者使用ajax在UI渲染后加载数据)

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

php laravel eloquent laravel-5.5
3个回答
4
投票

首先纠正你的伪代码应该是这样的:

$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与users表一起使用(如果每个事务和订单总是有用户)

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配置您的查询


1
投票

在这种情况下,您最好使用Cache,并且不需要每次都访问数据库。

它可以减少处理时间并具有更好的性能。


0
投票

你必须使用Laravel Relationship通过以下链接获得正确的指导

对于很多人的关系:

https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

根据你的情况使用合适的一个。希望它会对你有所帮助。

设置关系后,您可以访问表的数据调用单个对象。

© www.soinside.com 2019 - 2024. All rights reserved.