php - 优化查询——急切加载占用太多内存

标签 php mysql laravel laravel-4 eloquent

我有下表:

  • 用户(约 1.000 行)
  • Fans(大约 100.000 行)- 一个 User 有很多粉丝,一个 Fan 属于一个 User
  • 点赞(大约 100.000 行 - 一个用户有很多点赞,一个点赞属于一个用户

现在我想要一张 table

  • 用户名
  • 粉丝数
  • 点赞数

这是一个大表,我使用 jQuery DataTable 将其与 pagnition 结合使用,但这是关于服务器端的。

我已经建立了我所有的关系并摆好了 table :

$users = User::get();

foreach ($users as $user) {
echo $user->name;
echo $user->fans()->count();
echo $user->likes()->count();
}

这是很多查询,我想优化。我的第一次尝试是使用预加载。

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

但是这对服务器内存来说似乎很吃力。在我的本地环境中,我有 16 MB 的内存大小用于 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;
}

到您的 User 模型,现在您将只获得 1000 个用户行 + 粉丝和喜欢的汇总数据。

现在您可以使用:

$users = User::with('fansCountRelation', 'likesCountRelation')->get();
foreach ($users as $user) {
    echo $user->name;
    echo $user->likes_count;
    echo $user->fans_count;
}

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

如果这会花费你很多时间,你应该确保你的 fanslikes 表有 user_id 列的索引。它应该可以大大加快您的查询速度。

关于php - 优化查询——急切加载占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26368239/

相关文章:

mysql - 如何忽略 MYSQL SELECT LIKE %...% 上的字符

java - 无法使用 servlet 在数据库中的 JSP 中显示图像

php - 在 Laravel 4.2 中将 2 条数据共享给所有 View

php - Laravel View Composer 为每个 View 复制 SQL 查询

javascript - Tinymce编辑器图片上传插件添加完整图片URL

php - 'SEL' 是什么意思,如何修复?

javascript - Google Charts 在图表的第二行添加

PHP/MYSQL : Function mysqli_query() doesnt work for some reason

mysql - 为什么在 Laravel 5.8 中创建外键失败?

jquery - 在 jQuery 和 Laravel 中获取 Model jSignature 属性