哪个更有效的mysql,大型连接或单个表的多个查询?

时间:2011-01-13 15:50:45

标签: mysql

我有像这样的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]

}

7 个答案:

答案 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;