每次从数据库中检索数据时,我都会有关于减少数据库连接的问题。我假设我有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已经连接池,不是吗?
修改
用户有很多通知,订单,交易
我只是想问一下哪种方法可以改善我上面没有提到的性能。
答案 0 :(得分: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中限制和跳过方法或仅使用paginate)
4)如果您不需要用户数据,请不要在用户表中使用INNER JOIN(如果每个交易和订单始终都有用户)
5)使用 ab http://httpd.apache.org/docs/2.2/programs/ab.html测试请求以正确设置服务器
6)使用带有fpm和opcache的php> = 7.0会增加请求的限制
7)使用缓存API https://laravel.com/docs/5.5/cache存储查询结果(如果数据发生更改,则更新缓存)
配置您的查询答案 1 :(得分:1)
在这种情况下,您最好使用Cache,并且不需要每次都访问数据库。
它可以缩短处理时间并提高性能。
答案 2 :(得分:0)
您必须使用Laravel Relationship通过以下链接获取正确的指导
对于多对多的关系:
https://laravel.com/docs/5.5/eloquent-relationships#many-to-many
根据您的情况使用合适的一个。希望它会对你有所帮助。
设置关系后,您可以访问表调用单个对象的数据。