php怎么查找加载太慢,php – 优化查询 – 急切加载需要太多内存

我有以下表格:

>用户(约1.000行)

>粉丝(约100.000行) – 一个用户有很多粉丝,一个粉丝属于一个用户

>喜欢(大约100.000行 – 用户有很多喜欢,喜欢属于一个用户

现在我想要一张桌子

>用户名

>粉丝数量

>喜欢的人数

这是一个很大的表,我使用jQuery DataTable将它与pagnition一起使用,但这是关于服务器端的.

我已经建立了所有的关系,然后把桌子放在一边:

$users = User::get();

foreach ($users as $user) {

echo $user->name;

echo $user->fans()->count();

echo $user->likes()->count();

}

这是很多查询,我想优化.我的第一次尝试是使用Eager Loading.

$users = User::with('fans', 'likes')->get();

但这对服务器内存来说似乎很苛刻.在我的本地环境中,我有16 MB的memoriy大小的PHP脚本.它总是试图分配更多.

这是正常的吗?

是简单地为脚本提供更多内存的最佳解决方案吗?

我怎样才能优化我的查询?

解决方法:

如果您只想计算记录数量,那么只计算所有记录是没有意义的,现在您可以获得201000行.你应该添加:

public function fansCountRelation()

{

return $this->hasOne('Fan')->selectRaw('user_id, count(*) as count')

->groupBy('user_id');

}

public function likesCountRelation()

{

return $this->hasOne('Like')->selectRaw('user_id, count(*) as count')

->groupBy('user_id');

}

public function getLikesCountAttribute()

{

return $this->likesCountRelation ?

$this->likesCountRelation->count : 0;

}

public function getFansCountAttribute()

{

return $this->fansCountRelation ?

$this->fansCountRelation->count : 0;

}

对于您的用户模型,现在您将只获得1000个用户行聚合数据,供粉丝和喜欢使用.

现在你可以使用:

$users = User::with('fansCountRelation', 'likesCountRelation')->get();

foreach ($users as $user) {

echo $user->name;

echo $user->likes_count;

echo $user->fans_count;

}

但是,如果你确实需要它,你应该重新考虑. 1000行正常使用太多了.如果你将它用于导出目的,那很好,但是如果你只在管理面板中显示它,你应该使用分页.

如果它花费你很多时间,你应该确保你的粉丝有索引,并喜欢user_id列的表.它应该加快你的查询速度.

标签:php,laravel,mysql,eloquent,laravel-4

来源: https://codeday.me/bug/20190830/1767975.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值