Laravel 5.5优化查询

时间:2017-12-19 03:00:53

标签: php laravel eloquent laravel-5.5

每次从数据库中检索数据时,我都会有关于减少数据库连接的问题。我假设我有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已经连接池,不是吗?
修改
用户有很多通知,订单,交易 我只是想问一下哪种方法可以改善我上面没有提到的性能。

3 个答案:

答案 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存储查询结果(如果数据发生更改,则更新缓存)

8)使用https://github.com/barryvdh/laravel-debugbar

配置您的查询

答案 1 :(得分:1)

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

它可以缩短处理时间并提高性能。

答案 2 :(得分:0)

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

对于多对多的关系:

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

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

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