数据抓取/重组速度

问题描述:

这个问题可能会被标记为过宽或意见为主,但我冒这个险......数据抓取/重组速度

我有一个PHP REST的API,它从一个MySQL表获取的所有数据,还包括'hasMany'字段。我们称他们为'post'hasMany'comments'。

现在我做一选择与LEFT JOIN的意见,然后再通过结果走到输出重组到

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

一切都很好,直到我有一个以上的hasMany场,因为那么重构变得复杂(现在产生了双重条目),我需要多次遍历结果(不是手动的,但仍然使用内置函数)。

于是我想到了我的refacturing代码:
1.选择实际的项目( '后')
2.选择所有的hasMany字段( '意见', 'anythingelse',...)并添加结果。
这当然会在我的db上产生大量的动作。

所以我的问题是如果有人有一个简单的答案,如'更好地抓住数据库中的所有数据,并在php中完成工作'或相反。

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

某些信息: “发布”表可能会产生几百条记录,与hasMany相同。但结合一些hasMany领域,它可能会导致数千个记录集(第一个问题)。

使用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列在子表上被索引。

+0

谢谢你,你的_edit_是我最重要的部分! – Jeff

,我能想到的最好的替代办法是沿着线:

$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,那么很可能会发生自动化。

+0

'你需要决定'是真正的问题...谢谢! – Jeff

+0

所有这些都取决于应用程序的性质,数据和系统体系结构。除了你以外,没有人能够衡量你的特定环境。 – Sammitch

+0

是的,我知道这个问题非常广泛。你们俩都给了我同样的道路,我会在我的环境中做基准测试。我只是需要一个想法,如果这么多的SQL查询首先是一个愚蠢的方法......在编码和基准测试之前。 – Jeff