我有问题,每次从数据库中检索数据时都会减少数据库连接。我假设我有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个单独的查询,因为我的导师说如果每个表中有很多记录或者仪表板需要更多的表(不是用于加入)来查询,这个解决方案会减少服务器的语音。 我已经做了:
我想问一下:还有其他方法可以减少上述情况的处理时间吗?
关于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与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存储查询结果(如果数据发生更改,则更新缓存)
在这种情况下,您最好使用Cache,并且不需要每次都访问数据库。
它可以减少处理时间并具有更好的性能。
你必须使用Laravel Relationship通过以下链接获得正确的指导
对于很多人的关系:
https://laravel.com/docs/5.5/eloquent-relationships#many-to-many
根据你的情况使用合适的一个。希望它会对你有所帮助。
设置关系后,您可以访问表的数据调用单个对象。