数据抓取/重组速度
这个问题可能会被标记为过宽或意见为主,但我冒这个险......数据抓取/重组速度
我有一个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
列在子表上被索引。
,我能想到的最好的替代办法是沿着线:
$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,那么很可能会发生自动化。
谢谢你,你的_edit_是我最重要的部分! – Jeff