php之Laravel 5.5 优化查询
sharpest
阅读:11
2024-08-05 10:48:10
评论:0
我对每次从数据库检索数据时减少数据库连接有疑问。我假设我有 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(如果每个交易和订单总是有用户)
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.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。