数据抓取/重组速度

时间:2016-04-20 21:36:40

标签: php mysql

这个问题可能被标记为过于宽泛或基于意见,但我承担风险...

我在php中有一个REST-API,它从mysql表中获取所有数据,其中还包含'hasMany'字段。让我们称他们为'post'hasMany'comments'。

现在我在评论中选择LEFT JOIN进行一次选择,然后遍历结果以将输出重组为

{ "posts": [
    {"id": 1,
     "comments": [1,2,3] 
    },
    ....
]}

一切都很好,直到我有多个hasMany字段,因为然后重构变得复杂(现在产生双条目)我需要循环遍历结果(不是手动,但仍然使用内置函数)多次

所以我考虑重构我的代码:
1.选择实际项目('post')
2.选择所有hasMany字段('comments','anythingelse',...)并添加结果 这当然会对我的数据库产生大量的动作。

所以我的问题是如果有人有一个简单的答案,比如“更好地从数据库中一次性获取所有数据并在php中完成工作”或相反。

是的,我自己可以做基准测试。但是拳头 - 说实话我想避免所有重新编程只是为了发现它更慢 - 第二我不知道我的基准测试是否会在优化(和linux)生产机器上保持不变(现在我正在开发在windows上的easyPhp上。)

一些信息: 'post'表可能会产生大约100条记录,每条记录都与hasMany相同。但结合一些hasMany字段,它可能会产生数千个记录集(第一个aproach)。

2 个答案:

答案 0 :(得分:0)

我能想到的最佳选择将是:

$posts = $dbh->prepare('SELECT [fields] FROM posts WHERE [conditions]')->
  execute([...])->
  fetchAll();

$stmt = $dbh->prepare('SELECT id FROM comments WHERE post_id = ?');
for($i=0; $i<count($posts); $i++) {
  $stmt->execute($posts[$i]['id']);
  $posts[$i]['comments'] = $stmt->fetchAll();
}

您需要决定交易与重复之间的工作/间接权衡。作为联接结果的数据或多或少是单独检索每个帖子的评论。

如果您正在使用ORM,可能会自动发生上述行为。

答案 1 :(得分:0)

使用IN (…)运算符。

首先,自行获取相关帖子:

SELECT […stuff…] FROM posts WHERE […conditions…]

然后从您到达的结果中获取帖子ID列表,并将整个列表替换为一组表单查询:

SELECT […stuff…] FROM comments WHERE post_id IN (1, 2, 3 […etc…])
SELECT […stuff…] FROM anythingelse WHERE post_id IN (1, 2, 3 […etc…])

每个依赖表运行一个查询就可以了。它不比运行单个JOINed查询贵得多;事实上,它可能更便宜,因为父表中的字段没有重复。

确保post_id列在子表上编入索引。