mysql在哪里IN上大数据集或循环?

时间:2011-01-25 16:16:39

标签: sql mysql performance

我有以下情况:

 Table 1:

 articles

 id article_text  category  author_id
 1  "hello world"    4                1
 2 "hi"              5                2
 3 "wasup"           4                3


 Table 2

 authors

 id   name     friends_with
 1    "Joe"      "Bob"
 2    "Sue"      "Joe"
 3    "Fred"     "Bob"

我想知道给定类别的“Bob”朋友的作者总数。

因此,例如,对于类别4,有多少作者是“Bob”的朋友。

作者表非常大,在某些情况下,我有一百万作者是“鲍勃”的朋友

所以我尝试过:

获取与bob成为朋友的作者列表,然后遍历它们并获取该给定类别中每个类别的计数,并在我的代码中将所有这些计算在一起。

这种方法的问题是它可以生成一百万个查询,即使它们非常快,似乎应该有更好的方法。

我正在考虑尝试获取与bob成为朋友的作者列表,然后使用该列表构建IN子句,但我担心这会破坏查询集中允许的内存量。

似乎这是一个常见问题。有什么想法吗?

感谢

3 个答案:

答案 0 :(得分:1)

SELECT COUNT(DISTINCT auth.id)
FROM authors auth
INNER JOIN articles art ON auth.id = art.author_id
WHERE friends_with = 'bob' AND art.category = 4

需要Count(Distinct a.id),因为文章可能会为每位作者命中多行。

但是如果您对数据库有任何控制权,我会使用friends_with的链接表作为您的cussrent解决方案要么必须使用逗号分隔的名称列表,这将对性能造成灾难性的要求,或者需要完全不同的查询或每个作者都可以只有一个朋友。

id friend_id

然后查询看起来像这样

SELECT COUNT(DISTINCT auth.id)
FROM authors auth
INNER JOIN articles art ON auth.id = art.author_id
INNER JOIN friends f ON auth.id = f.id 
INNER JOIN authors fauth ON fauth.id = f.friend_id
WHERE fauth.name = 'bob' AND art.category = 4

它更复杂,但允许很多朋友,只需要记住,这个结构要求每对朋友有2行,一个从joe到bob,一个从bob到joe。

您可以以不同方式构建它,但这会使查询更加复杂。

答案 1 :(得分:0)

也许像

select fr.name, 
         fr.id, 
         au.name,
         ar.article_text,
         ar.category, 
         ar.author_id 
from authors fr, authors au, articles ar 
where fr.id = ar.author_id 
and au.friends_with = fr.name 
and ar.category = 4 ;

只是计数...

select count(distinct fr.name)  
from authors fr, authors au, articles ar 
where fr.id = ar.author_id 
and au.friends_with = fr.name 
and ar.category = 4 ;

答案 2 :(得分:0)

不使用连接的版本(希望可以使用!)

来自authors_with ='Bob'和id in的作者的SELECT count(distinct id)(从category = 4的文章中选择author_id)

当我开始使用SQL时,我发现使用'IN'更容易理解语句。