我有像这样的mysql数据库
发布 - 500,000行(Postid,Userid)
照片 - 200,000行(Photoid,Postid)
大约有50,000个帖子有照片,平均每个4个,大多数帖子都没有照片。
我需要获取包含用户ID照片的所有帖子的Feed,平均每个帖子50个。
哪种方法更有效?
1:大加入
select *
from post
left join photo on post.postid=photo.postid
where post.userid=123
2:多次查询
select * from post where userid=123
while (loop through rows) {
select * from photo where postid=row[postid]
}
答案 0 :(得分:4)
我没有对此进行过测试,但我非常怀疑(在几乎细胞水平上)连接会非常大,速度快得多 - 你所尝试的几乎就是为什么毕竟存在联接。
此外,在脚本语言方面会有相当少的开销< - > MySQL通信等,但我怀疑这是一个静音因素。
答案 1 :(得分:1)
通过正确的索引(如前所述),JOIN总是更快,但是当你正在使用查询缓存时,可能更容易缓存几个较小的查询。查询包含的表越多,失效频率越高的可能性越大。
只要解析和优化过程,我相信MySQL在内部维护自己的统计数据,这通常只发生一次。执行多个查询时丢失的是往返时间和客户端缓冲延迟,如果结果集的大小相对较小,则会很小。
答案 2 :(得分:0)
加入会更快。
每个单独的查询都需要解析,优化和执行,这需要很长时间。
不要忘记创建以下索引:
post (userid)
photo (postid)
答案 3 :(得分:0)
通过对postid列进行适当的索引,连接应该更好。
答案 4 :(得分:0)
还有可能出现子查询:
SELECT * FROM photo WHERE postid IN (SELECT postid FROM post WHERE userid = 123);
我首先要优化您的查询,例如显然不需要select * from post where userid=123
,因为您只在循环中使用row[postid]
,所以如果要拆分查询,请不要select *
。
然后我会运行一对测试哪个更快但只加入两个表通常是最快的(不要忘记在需要时创建一个索引)。
如果您计划将“大查询”设置得非常大(通过加入更多表格),事情会变得非常缓慢,您可能需要拆分查询。我曾经加入了七个表,这些表使查询运行了30秒。在几分之一秒内拆分运行中的查询。
答案 5 :(得分:0)
我不确定这一点,但还有另一种选择。根据使用的索引,它可能会更慢或更快。
在您的情况下,例如:
select t1.postid FROM (select postid from post where userid = 23) AS t1 JOIN photo ON t1.postid = photo.postid
如果表t1中的行数与表格相比较小,则可能会有相当大的性能提升。但我还没有测试过它。
答案 6 :(得分:0)
SELECT * FROM photo, post
WHERE post.userid = 123 AND photo.postid = post.postid;
如果您只想要包含照片的帖子,请以照片表作为基表构建查询。请注意,您将获得每个结果行重复的帖子信息。
如果您不想返回每行的所有帖子信息,则可以选择
SELECT DISTINCT postid from photo, post where post.userid = 123;
然后foreach postid,你可以
SELECT * from photo WHERE postid = $inpostid;