【发布时间】:2020-03-06 16:27:03
【问题描述】:
下面的代码用于在一个页面中显示一个包含 15 个结果的表格。为此,我使用了两个不同的数据库,一个是 wordpress 数据库,另一个是我创建的个人数据库。
第一个 Query 用于从 wordpress 数据库中获取表值,但它没有获取用户名,因为 wordpress 仅将用户 ID 存储在该表中。我唯一拥有正确用户名的地方是我的第二个个人数据库。
为此,我使用了 foreach 循环来替换用户名的 ID。因此,在循环内部,有一个用于获取用户名的新查询。
我的问题是,每次加载页面时,我都会同时运行 16 个数据库查询,因此它会发出 16 个数据库请求,这让我的页面变慢。
public function index() {
$posts = DB::connection('mysql2')
->table('wp_rocketsciencebrposts')
->select('ID', 'post_title', 'post_status', 'post_author', 'post_date')
->whereIn('post_status', ['publish', 'private'])
->where('post_type', 'post')
->orderBy('id', 'desc')
->paginate(15, ['*'], 'posts');
$posts = compact('posts');
foreach($posts['posts'] as &$value){
//this DB Query is making my page slow, since it's inside this foreach loop, therefore, making 16 database requests
$value->post_author = DB::connection('mysql')
->table('users')
->select('name')
->where('rsbwordpressid', $value->post_author)
->value('name');
}
return view('posts/posts', $posts);
}
我确信解决方案非常简单,但我无法提出如何将第二个数据库查询置于循环之外的策略,从而避免所有不必要的数据库请求。
请帮忙。
【问题讨论】:
-
1) 通过 AJAX 填充表格,而不是源代码; 2) 缓存结果。
-
抱歉,我是新手,这对我来说太过分了。我没有在我的项目中的任何其他地方使用 AJAX。我认为也许有一个解决方案,通过创建另一个循环并将值存储在一个数组中,使用它来只发出一个 DB 请求,但我真的不知道我该怎么做。
-
附加信息请求。 RAM 大小、# 核心、MySQL 主机服务器上的任何 SSD 或 NVME 设备?在 pastebin.com 上发布并分享链接。从您的 SSH 登录根目录中,文本结果为:B) SHOW GLOBAL STATUS;至少 24 小时正常运行时间后 C) 显示全局变量; D) 显示完整的处理程序;用于服务器工作负载调整分析,以提供使您的设计可以接受的建议。