Hoà*_*ăng 2 php laravel eloquent laravel-5.5
我有一个关于每次从DB检索数据时减少数据库连接的问题。我假设我有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');
Run Code Online (Sandbox Code Playgroud)
因此,我必须运行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');
Run Code Online (Sandbox Code Playgroud)
我还有一些其他提示,您可以考虑:
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中的limit和skip方法或仅分页)
4)如果您不需要用户数据,请不要对用户表使用INNER JOIN(如果每个交易和订单始终有用户)
5)使用Ab http://httpd.apache.org/docs/2.2/programs/ab.html测试请求以正确设置服务器
6)将php> = 7.0与fpm和opcache一起使用会增加请求的限制
7)使用Cache API https://laravel.com/docs/5.5/cache存储查询结果(如果更改了数据,则更新缓存)
8)使用https://github.com/barryvdh/laravel-debugbar配置您的查询